springboot 學習之路 8 (整合websocket(1))




目錄:【持續更新。。。。。】
  
  spring 部分常用注解
  spring boot 學習之路1(簡單入門)
  spring boot 學習之路2(注解介紹)
  spring boot 學習之路3( 集成mybatis )
  spring boot 學習之路4(日志輸出)
  spring boot 學習之路5(打成war包部署tomcat)
  spring boot 學習之路6(定時任務)
  spring boot 學習之路6(集成durid連接池)
  spring boot 學習之路7(靜態頁面自動生效問題)
  spring boot 學習之路8 (整合websocket(1))
  spring boot 學習之路9 (項目啟動后就執行特定方法)

 


 

初探websocket:

  WebSocket是html5新增加的一種通信協議,目前流行的瀏覽器都支持這個協議,例如Chrome,Safari,Firefox,Opera,IE等等,對該協議支持最早的應該是chrome,從chrome12就已經開始支持,隨着協議草案的不斷變化,各個瀏覽器對協議的實現也在不停的更新。該協議還是草案,沒有成為標准,不過成為標准應該只是時間問題了,從WebSocket草案的提出到現在已經有十幾個版本了,目前對該協議支持最完善的瀏覽器應該是chrome,畢竟WebSocket協議草案也是Google發布的。

WebSocket API簡介:

  

var ws = new WebSocket(“ws://localhost:9999/ws/huhy/”);   
ws.onopen
= function(){ws.send(“Test!”); };
ws.onmessage
= function(evt){console.log(evt.data);ws.close();};
ws.onclose
= function(evt){console.log(“WebSocketClosed!”);};
ws.onerror
= function(evt){console.log(“WebSocketError!”);};

注:

第一行代碼是在申請一個WebSocket對象,參數是需要連接的服務器端的地址,同http協議使用http://開頭一樣,WebSocket協議的URL使用ws://開頭,另外安全的WebSocket協議使用wss://開頭。

第二行到第五行為WebSocket對象注冊消息的處理函數,WebSocket對象一共支持四個消息 onopen, onmessage, onclose和onerror,當Browser和WebSocketServer連接成功后,會觸發onopen消息;如果連接失敗,發送、接收數據失敗或者處理數據出現錯誤,browser會觸發onerror消息;當Browser接收到WebSocketServer發送過來的數據時,就會觸發onmessage消息,參數evt中包含server傳輸過來的數據;當Browser接收到WebSocketServer端發送的關閉連接請求時,就會觸發onclose消息。我們可以看出所有的操作都是采用消息的方式觸發的,這樣就不會阻塞UI,使得UI有更快的響應時間,得到更好的用戶體驗。


說正事,

spring boot 和websocket的整合:

  我分三步:

  第一步:在pom中引入依賴jar包

    

  第二步:

    開發靜態頁面:由於spring boot 應用,所以選擇類控制頁面

    

   第三步:  往spring容器中注入 ServerEndpointExporter

      

 

     實現上面接口;

      

  1 package com.huhy.web.websocket;
  2 
  3 /**
  4  * @Author:{huhy}
  5  * @DATE:Created on 2017/11/20 10:34
  6  * @Class Description:
  7  */
  8 import org.springframework.stereotype.Component;
  9 
 10 import javax.websocket.*;
 11 import javax.websocket.server.PathParam;
 12 import javax.websocket.server.ServerEndpoint;
 13 import java.io.IOException;
 14 import java.util.Map;
 15 import java.util.concurrent.ConcurrentHashMap;
 16 
 17 /**
 18  * ServerEndpoint
 19  * <p>
 20  * 使用springboot的唯一區別是要@Component聲明下,而使用獨立容器是由容器自己管理websocket的,但在springboot中連容器都是spring管理的。
 21  * <p>
 22  * 雖然@Component默認是單例模式的,但springboot還是會為每個websocket連接初始化一個bean,所以可以用一個靜態set保存起來。
 23  */
 24 @ServerEndpoint("/ws/huhy/{userName}") //WebSocket客戶端建立連接的地址
 25 @Component
 26 public class ChatRoomServerEndpoint {
 27 
 28     /**
 29      * 存活的session集合(使用線程安全的map保存)
 30      */
 31     private static Map<String, Session> livingSessions = new ConcurrentHashMap<>();
 32 
 33     /**
 34      * 建立連接的回調方法
 35      *
 36      * @param session  與客戶端的WebSocket連接會話
 37      * @param userName 用戶名,WebSocket支持路徑參數
 38      */
 39     @OnOpen
 40     public void onOpen(Session session, @PathParam("userName") String userName) {
 41         livingSessions.put(session.getId(), session);
 42         sendMessageToAll(userName + " 加入聊天室");
 43     }
 44 
 45     /**
 46      * 收到客戶端消息的回調方法
 47      *
 48      * @param message 客戶端傳過來的消息
 49      * @param session 對應的session
 50      */
 51     @OnMessage
 52     public void onMessage(String message, Session session, @PathParam("userName") String userName) {
 53         sendMessageToAll(userName + " : " + message);
 54     }
 55 
 56 
 57     /**
 58      * 發生錯誤的回調方法
 59      *
 60      * @param session
 61      * @param error
 62      */
 63     @OnError
 64     public void onError(Session session, Throwable error) {
 65         System.out.println("發生錯誤");
 66         error.printStackTrace();
 67     }
 68 
 69     /**
 70      * 關閉連接的回調方法
 71      */
 72     @OnClose
 73     public void onClose(Session session, @PathParam("userName") String userName) {
 74         livingSessions.remove(session.getId());
 75         sendMessageToAll(userName + " 退出聊天室");
 76     }
 77 
 78 
 79     /**
 80      * 單獨發送消息
 81      *
 82      * @param session
 83      * @param message
 84      */
 85     public void sendMessage(Session session, String message) {
 86         try {
 87             session.getBasicRemote().sendText(message);
 88         } catch (IOException e) {
 89             e.printStackTrace();
 90         }
 91     }
 92 
 93     /**
 94      * 群發消息
 95      *
 96      * @param message
 97      */
 98     public void sendMessageToAll(String message) {
 99         livingSessions.forEach((sessionId, session) -> {
100             sendMessage(session, message);
101         });
102     }
103 
104 }

 

 


 

 測試:

    先啟動spring boot 應用:

    

    啟動兩個以上頁面

     

    輸入驗證是不是可以同步:

    

    


免責聲明!

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



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