javascript
springboot websocket_SpringBoot 集成 WebSocket 实现前后端消息互传
WebSocket 協議是基于 TCP 的一種新的網絡協議。它實現了瀏覽器與服務器全雙工 (full-duplex) 通信—允許服務器主動發送信息給客戶端。
為什么需要WebSocket?
大家都知道以前客戶端想知道服務端的處理進度,要不停地使用 Ajax 進行輪詢,讓瀏覽器隔個幾秒就向服務器發一次請求,這對服務器壓力較大。另外一種輪詢就是采用 long poll 的方式,這就跟打電話差不多,沒收到消息就一直不掛電話,也就是說,客戶端發起連接后,如果沒消息,就一直不返回 response 給客戶端,連接階段一直是阻塞的。
而 WebSocket 解決了 HTTP 的這幾個難題。當服務器完成協議升級后( HTTP -> WebSocket ),服務端可以主動推送信息給客戶端,解決了輪詢造成的同步延遲問題。由于 WebSocket 只需要一次 HTTP 握手,服務端就能一直與客戶端保持通信,直到關閉連接,這樣就解決了服務器需要反復解析 HTTP 協議,減少了資源的開銷。
現在通過 SpringBoot 集成 WebSocket 來實現前后端通信。
集成 WebSocket 實現前后端通信
項目代碼結構圖
依賴導入
SpringBoot2.0 對 WebSocket 的支持簡直太棒了,直接就有包可以引入 。
org.springframework.boot spring-boot-starter-websocket配置 WebSocketConfig
啟用WebSocket的支持也是很簡單,將ServerEndpointExporter對象注入到容器中。
package com.tuhu.websocketsample.configuration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configurationpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}WebSocket 服務端 WebSocketServer
因為 WebSocket 是類似客戶端服務端的形式(采用ws協議),那么這里的 WebSocketServer 其實就相當于一個 ws協議的 Controller。直接 @ServerEndpoint("/websocket") 、@Component 啟用即可,然后在里面實現@OnOpen , @onClose ,@onMessage等方法
package com.tuhu.websocketsample.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.concurrent.CopyOnWriteArraySet;@Component@ServerEndpoint("/websocket/{sid}")@Slf4jpublic class WebSocketServer { /** * 靜態變量,用來記錄當前在線連接數。應該把它設計成線程安全的。 */ private static int onlineCount = 0; /** * concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象。 */ private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>(); /** * 與某個客戶端的連接會話,需要通過它來給客戶端發送數據 */ private Session session; /** * 接收sid */ private String sid=""; /** * 連接建立成功調用的方法 **/ @OnOpen public void onOpen(Session session,@PathParam("sid") String sid) { this.session = session; //加入set中 webSocketSet.add(this); //在線數加1 addOnlineCount(); log.info("有新窗口開始監聽:"+sid+總結
以上是生活随笔為你收集整理的springboot websocket_SpringBoot 集成 WebSocket 实现前后端消息互传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pb 如何判断缺纸_如何快速判断是否低估
- 下一篇: vue :class 动态绑定样式_Vu