Java 与 JavaScript 对websocket的使用

ebsocket,HTML5中新一代全双工通信协议。其底层仍然是http协议。

传统 HTTP 请求响应客户端服务器交互图

图 1. 传统 HTTP 请求响应客户端服务器交互图

WebSocket 请求响应客户端服务器交互图

图 2.WebSocket 请求响应客户端服务器交互图

 

 

WebSocket 客户端支持
浏览器支持情况
Chrome Chrome version 4+支持
Firefox Firefox version 5+支持
IE IE version 10+支持
Safari IOS 5+支持
Android Brower Android 4.5+支持

webSocket消息推送例子

 

Java后端

pom.xml

 

[javascript] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <!-- webSocket -->  
  2. <dependency>  
  3.     <groupId>javax</groupId>  
  4.     <artifactId>javaee-api</artifactId>  
  5.     <version>7.0</version>  
  6. </dependency>  

 


 

(tomcat7.027开始支持websocket,但是tomcat7.047开始才能使用注解形式的websoket,从该版本开始websoket被集成进入了javaee7中)

 

java代码:

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. package com.student.system.listen;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.concurrent.CopyOnWriteArraySet;  
  5.   
  6. import javax.websocket.OnClose;  
  7. import javax.websocket.OnError;  
  8. import javax.websocket.OnMessage;  
  9. import javax.websocket.OnOpen;  
  10. import javax.websocket.Session;  
  11. import javax.websocket.server.ServerEndpoint;  
  12.   
  13. @ServerEndpoint("/websocket")  
  14. public class WebSocketListen {  
  15.   
  16.     // 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。  
  17.     private static int onlineCount = 0;  
  18.   
  19.     // concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识  
  20.     private static CopyOnWriteArraySet<WebSocketListen> webSocketSet = new CopyOnWriteArraySet<WebSocketListen>();  
  21.   
  22.     // 与某个客户端的连接会话,需要通过它来给客户端发送数据  
  23.     private Session session;  
  24.   
  25.     /** 
  26.      * 连接建立成功调用的方法 
  27.      *  
  28.      * @param session 
  29.      *            可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 
  30.      */  
  31.     @OnOpen  
  32.     public void onOpen(Session session) {  
  33.         this.session = session;  
  34.         webSocketSet.add(this); // 加入set中  
  35.         addOnlineCount(); // 在线数加1  
  36.         System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());  
  37.     }  
  38.   
  39.     /** 
  40.      * 连接关闭调用的方法 
  41.      */  
  42.     @OnClose  
  43.     public void onClose() {  
  44.         webSocketSet.remove(this); // 从set中删除  
  45.         subOnlineCount(); // 在线数减1  
  46.         System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());  
  47.     }  
  48.   
  49.     /** 
  50.      * 收到客户端消息后调用的方法 
  51.      *  
  52.      * @param message 
  53.      *            客户端发送过来的消息 
  54.      * @param session 
  55.      *            可选的参数 
  56.      */  
  57.     @OnMessage  
  58.     public void onMessage(String message, Session session) {  
  59.         System.out.println("来自客户端的消息:" + message);  
  60.         // 群发消息  
  61.         for (WebSocketListen item : webSocketSet) {  
  62.             try {  
  63.                 item.sendMessage(message);  
  64.             } catch (IOException e) {  
  65.                 e.printStackTrace();  
  66.                 continue;  
  67.             }  
  68.         }  
  69.     }  
  70.   
  71.     /** 
  72.      * 发生错误时调用 
  73.      *  
  74.      * @param session 
  75.      * @param error 
  76.      */  
  77.     @OnError  
  78.     public void onError(Session session, Throwable error) {  
  79.         System.out.println("发生错误");  
  80.         error.printStackTrace();  
  81.     }  
  82.   
  83.     /** 
  84.      * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。 
  85.      *  
  86.      * @param message 
  87.      * @throws IOException 
  88.      */  
  89.     public void sendMessage(String message) throws IOException {  
  90.         this.session.getBasicRemote().sendText(message);  
  91.         // this.session.getAsyncRemote().sendText(message);  
  92.     }  
  93.   
  94.     public static synchronized int getOnlineCount() {  
  95.         return onlineCount;  
  96.     }  
  97.   
  98.     public static synchronized void addOnlineCount() {  
  99.         WebSocketListen.onlineCount++;  
  100.     }  
  101.   
  102.     public static synchronized void subOnlineCount() {  
  103.         WebSocketListen.onlineCount--;  
  104.     }  
  105. }  


JSP页面

 

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  6. <title>websocket</title>  
  7. </head>  
  8. <body>  
  9.     Welcome<br/>  
  10.     <input id="text" type="text"/>  
  11.         <button onclick="send()">发送消息</button>  
  12.         <hr/>       
  13.         <button onclick="closeWebSocket()">关闭WebSocket连接</button>  
  14.         <hr/>  
  15.         <div id="message"></div>  
  16.   <script type="text/javascript">  
  17.     var websocket = null;  
  18.        //判断当前浏览器是否支持WebSocket  
  19.        if ('WebSocket' in window) {  
  20.           websocket = new WebSocket("ws://localhost:8028/ThesisManage/websocket");  
  21.       }  
  22.       else {  
  23.           alert('当前浏览器 Not support websocket')  
  24.       }  
  25.      
  26.       //连接发生错误的回调方法  
  27.       websocket.onerror = function () {  
  28.            setMessageInnerHTML("WebSocket连接发生错误");  
  29.       };  
  30.      
  31.        //连接成功建立的回调方法  
  32.        websocket.onopen = function () {  
  33.            setMessageInnerHTML("WebSocket连接成功");  
  34.        }  
  35.      
  36.       //接收到消息的回调方法  
  37.        websocket.onmessage = function (event) {  
  38.            setMessageInnerHTML(event.data);  
  39.       }  
  40.     
  41.        //连接关闭的回调方法  
  42.        websocket.onclose = function () {  
  43.           setMessageInnerHTML("WebSocket连接关闭");  
  44.        }  
  45.      
  46.        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
  47.        window.onbeforeunload = function () {  
  48.            closeWebSocket();  
  49.        }  
  50.      
  51.        //将消息显示在网页上  
  52.        function setMessageInnerHTML(innerHTML) {  
  53.           document.getElementById('message').innerHTML += innerHTML + '<br/>';  
  54.       }  
  55.      
  56.       //关闭WebSocket连接  
  57.        function closeWebSocket() {  
  58.            websocket.close();  
  59.        }  
  60.     
  61.        //发送消息  
  62.        function send() {  
  63.           var message = document.getElementById('text').value;  
  64.           websocket.send(message);  
  65.        }  
  66.   </script>  
  67. </body>  
  68. </html>  


页面效果:

 

 

posted @ 2017-03-02 13:21  庞国明  阅读(3342)  评论(2编辑  收藏  举报