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>  


頁面效果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM