1、通过WebSocketServlet来实现

  1. import java.io.IOException;
  2. import java.io.UnsupportedEncodingException;
  3. import java.nio.ByteBuffer;
  4. import java.nio.CharBuffer;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import java.util.Set;
  10.  
  11. import javax.servlet.http.HttpServletRequest;
  12.  
  13. import org.apache.catalina.websocket.MessageInbound;
  14. import org.apache.catalina.websocket.StreamInbound;
  15. import org.apache.catalina.websocket.WebSocketServlet;
  16. import org.apache.catalina.websocket.WsOutbound;
  17.  
  18. public class ChatWebSocketServlet extends WebSocketServlet {
  19. /**
  20. *
  21. */
  22. private static final long serialVersionUID = 911879078000755859L;
  23. //private final Map<Integer, WsOutbound> map = new HashMap<Integer, WsOutbound>();
  24. private final Map<String,WsOutbound> users = new HashMap<String,WsOutbound>();
  25.  
  26. @Override
  27. protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest request)
  28. {
  29. String username = null;
  30. try {
  31. username = request.getParameter("username");
  32. System.out.println(username);
  33. if(username != null){
  34. username = new String(username.getBytes("ISO8859_1"),"UTF-8");
  35. }
  36. } catch (Exception e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. System.out.println(username+" 请求连接:");
  41. return new ChatMessageInbound(username);
  42. }
  43.  
  44. class ChatMessageInbound extends MessageInbound {
  45.  
  46. private String userName = "user";
  47.  
  48. public ChatMessageInbound(String userName) {
  49. this.userName = userName;
  50. }
  51.  
  52. @Override
  53. protected void onOpen(WsOutbound outbound) {
  54. users.put(userName, outbound);
  55. System.out.println(userName+"上线了,总共"+users.size()+"人在线");
  56. super.onOpen(outbound);
  57. }
  58.  
  59. @Override
  60. protected void onClose(int status) {
  61. users.remove(userName);
  62. System.out.println("下线:"+userName);
  63. super.onClose(status);
  64. }
  65.  
  66. @Override
  67. protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
  68. // TODO Auto-generated method stub
  69. }
  70.  
  71. @Override
  72. protected void onTextMessage(CharBuffer buffer) throws IOException {
  73.  
  74. String msg = buffer.toString();
  75. System.out.println(userName+":"+msg);
  76. Date date = new Date();
  77. SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  78. msg = userName+" " + sdf.format(date)+":\n" + msg;
  79. broadcast(msg);
  80. }
  81.  
  82. private void broadcast(String msg) {
  83. Set<String> set = users.keySet();
  84. for (String name : set)
  85. {
  86. WsOutbound outbound = users.get(name);
  87.  
  88. CharBuffer buffer = CharBuffer.wrap(msg);
  89. try {
  90. outbound.writeTextMessage(buffer);
  91. outbound.flush();
  92. } catch (Exception e) {
  93. e.printStackTrace();
  94. }
  95. System.out.println(name+"----");
  96.  
  97. }
  98. }
  99. }
  100. }

2、通过@ServerEndpoint注解

  1. import java.io.IOException;
  2. import java.util.Set;
  3. import java.util.concurrent.CopyOnWriteArraySet;
  4.  
  5. import javax.websocket.OnClose;
  6. import javax.websocket.OnError;
  7. import javax.websocket.OnMessage;
  8. import javax.websocket.OnOpen;
  9. import javax.websocket.Session;
  10. import javax.websocket.server.PathParam;
  11. import javax.websocket.server.ServerEndpoint;
  12.  
  13. @ServerEndpoint(value = "/ws/chat/{nickName}")
  14. public class Chat {
  15.  
  16. /**
  17. * 连接对象集合
  18. */
  19. private static final Set<Chat> connections = new CopyOnWriteArraySet<Chat>();
  20.  
  21. private String nickName;
  22.  
  23. /**
  24. * WebSocket Session
  25. */
  26. private Session session;
  27.  
  28. public Chat() {
  29. }
  30.  
  31. /**
  32. * 打开连接
  33. *
  34. * @param session
  35. * @param nickName
  36. */
  37. @OnOpen
  38. public void onOpen(Session session,
  39. @PathParam(value = "nickName") String nickName) {
  40.  
  41. this.session = session;
  42. this.nickName = nickName;
  43.  
  44. connections.add(this);
  45. String message = String.format("System> %s %s", this.nickName,
  46. " has joined.");
  47. Chat.broadCast(message);
  48. System.out.println(message);
  49. }
  50.  
  51. /**
  52. * 关闭连接
  53. */
  54. @OnClose
  55. public void onClose() {
  56. connections.remove(this);
  57. String message = String.format("System> %s, %s", this.nickName,
  58. " has disconnection.");
  59. Chat.broadCast(message);
  60. System.out.println(message);
  61. }
  62.  
  63. /**
  64. * 接收信息
  65. *
  66. * @param message
  67. * @param nickName
  68. */
  69. @OnMessage
  70. public void onMessage(String message,
  71. @PathParam(value = "nickName") String nickName) {
  72. Chat.broadCast(nickName + ">" + message);
  73. System.out.println(message);
  74. }
  75.  
  76. /**
  77. * 错误信息响应
  78. *
  79. * @param throwable
  80. */
  81. @OnError
  82. public void onError(Throwable throwable) {
  83. System.out.println(throwable.getMessage());
  84. }
  85.  
  86. /**
  87. * 发送或广播信息
  88. *
  89. * @param message
  90. */
  91. private static void broadCast(String message) {
  92. for (Chat chat : connections) {
  93. try {
  94. synchronized (chat) {
  95. chat.session.getBasicRemote().sendText(message);
  96. }
  97. } catch (IOException e) {
  98. connections.remove(chat);
  99. try {
  100. chat.session.close();
  101. } catch (IOException e1) {
  102. }
  103. Chat.broadCast(String.format("System> %s %s", chat.nickName,
  104. " has bean disconnection."));
  105. System.out.println(String.format("System> %s %s", chat.nickName,
  106. " has bean disconnection."));
  107. }
  108. }
  109. }
  110. }

3、android

  1. package com.example.test;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.EditText;
  8. import android.widget.Toast;
  9. import de.tavendo.autobahn.WebSocketConnection;
  10. import de.tavendo.autobahn.WebSocketConnectionHandler;
  11. import de.tavendo.autobahn.WebSocketException;
  12.  
  13. public class MainActivity extends Activity {
  14.  
  15. final WebSocketConnection wsc = new WebSocketConnection();
  16. private EditText edt;
  17.  
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. edt = (EditText) findViewById(R.id.edt1);
  23. findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
  24.  
  25. @Override
  26. public void onClick(View v) {
  27. if (wsc.isConnected()) {
  28. wsc.sendTextMessage(edt.getText().toString());
  29. } else {
  30. Toast.makeText(getApplicationContext(), "请先加入",
  31. Toast.LENGTH_SHORT).show();
  32. }
  33. }
  34. });
  35. // System.out.println("websocket///");
  36. findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
  37.  
  38. @Override
  39. public void onClick(View v) {
  40. try {
  41. //"ws://192.168.1.106:9090/websocket01/chat.ws?username=server11"
  42. String url = "ws://192.168.1.106:8080/websocket01/ws/chat/server11";
  43. wsc.connect(url,
  44. new WebSocketConnectionHandler() {
  45.  
  46. @Override
  47. public void onBinaryMessage(byte[] payload) {
  48. System.out.println("onBinaryMessage size="
  49. + payload.length);
  50. }
  51.  
  52. @Override
  53. public void onClose(int code, String reason) {
  54. System.out.println("onClose reason="
  55. + reason);
  56. }
  57.  
  58. @Override
  59. public void onOpen() {
  60. System.out.println("onOpen");
  61. wsc.sendTextMessage("Hello!");
  62. // wsc.disconnect();
  63. }
  64.  
  65. @Override
  66. public void onRawTextMessage(byte[] payload) {
  67. System.out.println("onRawTextMessage size="
  68. + payload.length);
  69.  
  70. }
  71.  
  72. @Override
  73. public void onTextMessage(String payload) {
  74. System.out.println("onTextMessage"
  75. + payload);
  76. edt.setText(payload);
  77. }
  78. });
  79. } catch (WebSocketException e) {
  80. // TODO Auto-generated catch block
  81. e.printStackTrace();
  82. }
  83.  
  84. }
  85. });
  86.  
  87. }
  88.  
  89. @Override
  90. protected void onStop() {
  91. wsc.disconnect();
  92. super.onStop();
  93. }
  94.  
  95. }

来自网络,稍加修改。

附件地址.

android websocket推送的更多相关文章

  1. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  2. Android消息推送怎么实现?

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  3. android 消息推送

    android 消息推送 极光推送百度云推送(语音)友盟消息推送

  4. Android消息推送——JPush极光推送

    刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...

  5. 【原】android本地推送

    android本地推送的实现原理:开启一个BroadcastReceiver和一个AlarmManager,闹钟设置推送唤醒时间,BroadcastReceiver一直在检测是否应该推送. 目前遗留问 ...

  6. Android实现推送方式解决方案(转)

    本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...

  7. 【android极光推送】—从客户端到后台,一文通吃

    sion android:name="android.permission.VIBRATE" /> <uses-permission android:name=&quo ...

  8. Android消息推送完美方案[转]

    转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...

  9. Android消息推送完美方案

    转自:http://bbs.hiapk.com/thread-4652657-1-1.html 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原 ...

随机推荐

  1. NODE编程(三)--构建Node Web程序1

    一.HTTP服务器的基本知识 1.Node如何向开发者呈现HTTP请求 Node中的http模块提供了HTTP服务器和客户端接口: var http = require('http'); 创建HTTP ...

  2. [转]Using Replacement Strings with Regex.Replace

    本文转自:http://www.knowdotnet.com/articles/regereplacementstrings.html The String.Replace function has ...

  3. 伸展树 Splay Tree

    Splay Tree 是二叉查找树的一种,它与平衡二叉树.红黑树不同的是,Splay Tree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,Splay Tree会将节点n旋 ...

  4. Java动态加载jar及class文件

    经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...

  5. Git CMD - rm: Remove files from the working tree and from the index

    命令格式 git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​ 命令参 ...

  6. oracle数据库创建表空间和表临时空间

    1:创建临时表空间 create temporary tablespace user_temp tempfile 'Q:\oracle\product\10.2.0\oradata\Test\xyrj ...

  7. JavaScript之模拟评星打分

    <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu ...

  8. JSP之session

    index.jsp: <form id="form1" name="form1" method="post" action=" ...

  9. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

  10. 第四十六篇、UICollectionView广告轮播控件

    这是利用人的视觉错觉来实现无限轮播,UICollectionView 有很好的重用机制,这只是部分核心代码,后期还要继续完善和代码重构. #import <UIKit/UIKit.h> # ...