SpringBoot3集成WebSocket的全過程
一、簡介
WebSocket通過一個(gè)TCP連接在客戶端和服務(wù)器之間建立一個(gè)全雙工、雙向的通信通道,使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù),在WebSocket的API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
【基于Postman工具的WebSocket交互】
Connected to ws://127.0.0.1:8088/web/socket/msg Handshake Details Request URL: http://127.0.0.1:8088/web/socket/msg Request Method: GET Status Code: 101 Request Headers Sec-WebSocket-Version: 13 Sec-WebSocket-Key: 5Qrs8JeRLsiY9G/PRJUocQ== Connection: Upgrade Upgrade: websocket Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Host: 127.0.0.1:8088 Response Headers Upgrade: websocket Connection: upgrade Sec-WebSocket-Accept: E3aFw2bBzxByPCynmQ7lZ+7BgsU= Sec-WebSocket-Extensions: permessage-deflate;client_max_window_bits=15
二、工程搭建
1、工程結(jié)構(gòu)

2、依賴管理
在starter-websocket的依賴中,涉及到spring框架中兩個(gè)關(guān)系較為密切的組件,分別是websocket和messaging組件。
<!--WebSocket-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>${spring-boot.version}</version>
</dependency>
三、WebSocket用法
1、示意圖
在下面的案例中,大致模擬這樣一個(gè)流程,三個(gè)客戶端分別和服務(wù)端建立連接,然后進(jìn)行客戶端之間的會(huì)話通信。

2、API參考
這里通過4個(gè)核心的方法注解,分別處理會(huì)話的不同動(dòng)作,比如連接的建立和關(guān)閉,通信交互和錯(cuò)誤處理;在實(shí)際的應(yīng)用場(chǎng)景中,需要在通信方法中設(shè)計(jì)更多的指令來應(yīng)對(duì)不同的業(yè)務(wù)場(chǎng)景。
@ServerEndpoint("/web/socket/msg")
public class MsgWebSocket {
private static final ConcurrentHashMap<String,Session> sessions = new ConcurrentHashMap<>();
private static final AtomicInteger onlineCount = new AtomicInteger(0);
/**
* 建立連接調(diào)用的方法
*/
@OnOpen
public void onOpen(Session session) {
String userId = session.getRequestParameterMap().get("userId").get(0);
// 加入Set中
sessions.put(userId,session);
// 在線數(shù)增加
onlineCount.getAndIncrement();
log.info("session-{},online-count-{}",session.getId(),onlineCount.get());
}
/**
* 客戶端消息處理的方法
*/
@OnMessage
public void sendMsg(Session sender,String message) throws Exception {
MsgDTO dto = JSONUtil.toBean(message, MsgDTO.class);
Session receiver = sessions.get(dto.getUserId());
if (receiver != null) {
receiver.getBasicRemote().sendText(dto.getMsg());
}
}
/**
* 關(guān)閉連接調(diào)用的方法
*/
@OnClose
public void onClose(Session session) {
String userId = session.getRequestParameterMap().get("userId").get(0);
// 從Set中刪除
sessions.remove(userId);
// 在線數(shù)減少
onlineCount.getAndDecrement();
log.info("session-{},down-line-count-{}",session.getId(),onlineCount.get());
}
/**
* 發(fā)生錯(cuò)誤調(diào)用的方法
*/
@OnError
public void onError(Session session, Throwable throwable) throws Exception {
log.error("Web Stock Error", throwable);
session.getBasicRemote().sendText(throwable.getMessage());
}
}
測(cè)試效果圖:注意這里使用的是postman最新版本。

四、總結(jié)
到此這篇關(guān)于SpringBoot3集成WebSocket的全過程的文章就介紹到這了,更多相關(guān)SpringBoot3集成WebSocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼
- springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available)
- SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法
- Springboot整合WebSocket實(shí)戰(zhàn)教程
- SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn)代碼
- SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼
- springboot整合websocket最基礎(chǔ)入門使用教程詳解
- 通過實(shí)例講解springboot整合WebSocket
- SpringBoot3整合WebSocket詳細(xì)指南
相關(guān)文章
Spring Security源碼解析之權(quán)限訪問控制是如何做到的
Spring Security 中對(duì)于權(quán)限控制默認(rèn)已經(jīng)提供了很多了,但是,一個(gè)優(yōu)秀的框架必須具備良好的擴(kuò)展性,下面小編給大家介紹Spring Security源碼解析之權(quán)限訪問控制是如何做到的,感興趣的朋友跟隨小編一起看看吧2021-05-05
j2ee之AJAX二級(jí)聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了j2ee之AJAX二級(jí)聯(lián)動(dòng)效果的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法
這篇文章主要介紹了Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11

