SpringBoot3整合WebSocket

一、WebSocket簡介

WebSocket協議是基于TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通信,允許服務器主動向客戶端推送數據。
與傳統的 HTTP 請求-響應模式不同,WebSocket 在建立連接后,允許服務器和客戶端之間進行雙向實時通信。

WebSocket主要特點:

  • 建立在 TCP 協議之上。
  • 與 HTTP 協議有著良好的兼容性。
  • 數據格式比較輕量,性能開銷小,通信高效。
  • 可以發送文本,也可以發送二進制數據。
  • 沒有同源限制,客戶端可以與任意服務器通信。
  • 協議標識符是ws(如果加密,則為wss),服務器網址就是 URL。

二、SpringBoot3集成WebSocket

引入 WebSocket依賴:

        <!-- WebSocket依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>3.4.5</version></dependency>

1、WebSocket配置類

創建 WebSocket 配置類,啟用 WebSocket 功能并注冊端點。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Autowiredprivate CustomTextWebSocketHandler customTextWebSocketHandler;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {/*** addHandler方法參數說明* 參數1:添加 WebSocket 處理器* 參數2:WebSocket的連接路徑、端口為項目端口、路徑為自定義。比如:URL = ws://127.0.0.1:38081/ws*/registry.addHandler(customTextWebSocketHandler, "/ws").setAllowedOrigins("*"); // 允許跨域訪問}}

2、自定義WebSocket處理器

創建自定義的 WebSocket 處理器,處理消息收發。

@Slf4j
@Component
@RequiredArgsConstructor
public class CustomTextWebSocketHandler extends TextWebSocketHandler {private final WebSocketSessionManager sessionManager;/*** 用于存儲WebSocket會話*/private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String sessionId = session.getId();sessionManager.add(session);log.info("WebSocket連接建立成功:{}", sessionId);}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();log.info("WebSocket收到消息 ==> sessionId = {}, payload = {} ", session.getId(), message.getPayload());boolean open = session.isOpen();if (!open) {log.info("WebSocket發送消息失敗 ==> sessionId = {} 不在線 ", session.getId());return;}try {/*** TODO 發送回復消息*/String replyMessage = "服務器 -> 客戶端 收到了,消息" + payload;session.sendMessage(new TextMessage(replyMessage));} catch (IOException e) {log.info("WebSocket發送消息異常 ==> sessionId = {}, e = ", session.getId(), e);}}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {log.info("WebSocket傳輸錯誤 ==> sessionId = {}, exception = {} ", session.getId(), exception.getMessage());// 傳輸錯誤,關閉連接this.afterConnectionClosed(session, CloseStatus.PROTOCOL_ERROR);}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {log.info("WebSocket連接關閉 ==> sessionId = {}, CloseStatus = {} ", session.getId(), status);sessionManager.remove(session);}/*** 廣播發送消息給所有連接的 WebSocket客戶端** @param message*/public void sendMessageByBroadcast(String message) {sessionManager.getAllSession().stream().filter(WebSocketSession::isOpen).forEach(session -> {try {session.sendMessage(new TextMessage(message));} catch (IOException e) {log.info("WebSocket 廣播發送消息異常 ==> sessionId = {}, e = ", session.getId(), e);}});}}

3、創建WebSocket會話管理類

自定義創建 WebSocket會話管理類,根據業務我們可以擴展存儲不同的信息。

@Slf4j
@Component
public class WebSocketSessionManager {/*** 用于存儲 WebSocket會話* key: sessionId* value: WebSocketSession*/private final Map<String, WebSocketSession> wsSessionMap = new ConcurrentHashMap<>();/*** 添加 WebSocket會話** @param session*/public void add(WebSocketSession session) {wsSessionMap.put(session.getId(), session);}/*** 移除 WebSocket會話** @param session*/public void remove(WebSocketSession session) {wsSessionMap.remove(session.getId());}/*** 獲取 WebSocket會話** @param sessionId* @return*/public WebSocketSession get(String sessionId) {return wsSessionMap.get(sessionId);}/*** 獲取所有 WebSocket會話*/public List<WebSocketSession> getAllSession() {Collection<WebSocketSession> sessions = wsSessionMap.values();return Optional.ofNullable(sessions).orElse(new ArrayList<>()).stream().toList();}
}

4、controller

創建測試controller,用來測試消息廣播。

@RestController
@RequestMapping("/api/wsTest")
@RequiredArgsConstructor
public class WSTestController {private final CustomTextWebSocketHandler customTextWebSocketHandler;/*** 廣播發送消息接口* 給所有連接的 WebSocket 客戶端** @param message* @return*/@GetMapping("/sendMessageByBroadcast")public ResponseEntity<String> sendMessageByBroadcast(@RequestParam("message") String message) {customTextWebSocketHandler.sendMessageByBroadcast(message);return ResponseEntity.ok("廣播發送消息接口 => 發送成功");}}

啟動項目,使用 WebSocket 在線測試工具等,測試ok。

WebSocket 在線測試工具:https://wstool.js.org/

在這里插入圖片描述

根據業務還可以自定義握手攔截器校驗token,配置最大閑置時間,比如3分鐘沒動自動關閉連接等配置。

在這里插入圖片描述

– 求知若饑,虛心若愚。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80993.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FTP Bounce Attack:原理、影響與防御

一、引言 FTP&#xff08;文件傳輸協議&#xff09;是一種用于在網絡上進行文件傳輸的協議&#xff0c;廣泛應用于各種網絡環境中。然而&#xff0c;FTP協議的安全性問題一直備受關注&#xff0c;其中FTP Bounce Attack&#xff08;FTP跳轉攻擊&#xff09;是一種具有代表性的…

文獻閱讀——NeuroBayesSLAM

原文地址 1.核心理論&#xff1a;貝葉斯多感官整合框架 目標&#xff1a;結合視覺線索 c v i c_{vi} cvi?和前庭線索 c v e c_{ve} cve?來估計頭部方向或位置 θ 貝葉斯公式 p ( θ ∣ c v i , c v e ) ∝ p ( c v i ∣ θ ) p ( c v e ∣ θ ) p ( θ ) p(\theta | c_{vi…

sentinel核心原理-高頻問題

核心原理 ?限流實現機制? ?滑動窗口算法?&#xff1a;將時間切分為子窗口動態統計QPS&#xff0c;避免固定窗口的邊界問題。?責任鏈模式?&#xff1a;通過NodeSelectorSlot、FlowSlot等Slot鏈式處理限流邏輯。 ?熔斷降級策略? ?慢調用比例?&#xff1a;當慢請求比例…

DataX 的大概簡單介紹(與Kettle做對比介紹)

DataX 是由阿里巴巴開源的輕量級 ETL 工具&#xff0c;專為批量數據同步設計&#xff0c;主打 “高性能、易擴展、跨數據源”。如果你熟悉 Kettle&#xff0c;可把它理解為 “更適合大數據場景的 ETL 選手”。以下從核心特性、應用場景、與 Kettle 對比等角度通俗解析&#xff…

通過上傳使大模型讀取并分析文件實戰

一、技術背景與需求分析 我們日常在使用AI的時候一定都上傳過文件&#xff0c;AI會根據用戶上傳的文件內容結合用戶的請求進行分析&#xff0c;給出用戶解答。但是這是怎么實現的呢&#xff1f;在我們開發自己的大模型應用時肯定是不可避免的要思考這個問題&#xff0c;今天我會…

RHCSA Linux 系統 硬盤管理

Linux 系統 硬盤管理 1扇區 512B&#xff0c;分區 多個扇區 512B 查看硬盤命令 [rootlocalhost ~]# lsblk 1.一般存儲相關操作 (1) 分區 ① MBR 分區 ?分區數量限制&#xff1a;主分區 0 - 4 個&#x…

計算機網絡——Session、Cookie 和 Token

在 Web 開發中&#xff0c;Session、Cookie 和 Token 是實現用戶會話管理和身份驗證的核心技術。它們既有聯系&#xff0c;也有明顯區別。以下從定義、原理、聯系、區別和應用場景等方面詳細解析。 一、基本定義與原理 1. Cookie 定義&#xff1a; 是瀏覽器存儲在客戶端的小…

雙均線量化交易策略指南

策略原理 采用兩條不同周期的簡單移動平均線&#xff08;SMA&#xff09;&#xff1a; 短期均線&#xff1a;5日線&#xff08;快速反應價格變化&#xff09;長期均線&#xff1a;20日線&#xff08;反映長期趨勢&#xff09; 交易信號生成規則&#xff1a; 當 5日線 > …

視頻太大?用魔影工廠壓縮并轉MP4,畫質不打折!

在日常生活中&#xff0c;我們常常需要將視頻文件轉換成不同的格式以適應各種設備或平臺的播放需求。魔影工廠作為一款功能強大且操作簡單的視頻轉換工具&#xff0c;深受用戶喜愛。本文中簡鹿辦公將手把手教你如何使用魔影工廠將視頻轉換為MP4格式&#xff0c;并進行個性化設置…

大騰智能 PDM 系統:全生命周期管理重塑制造企業數字化轉型路徑

在當今激烈的市場競爭中&#xff0c;產品迭代速度與質量已成為企業生存與發展的核心命脈。面對客戶需求多元化、供應鏈協同復雜化、研發成本管控精細化等挑戰&#xff0c;企業亟需一套能夠貫穿產品全生命周期的數字化解決方案。 大騰智能PDM系統通過構建覆蓋設計、研發、生產、…

CodeBuddy一騰訊內部已有超過 85% 的程序員正在使用de編程工具

大家好&#xff0c;我是程序員500佰&#xff0c;目前正在前往獨立開發路線&#xff0c;我會在這里分享關于編程技術、獨立開發、技術資訊以及編程感悟等內容。 如果本文能給你提供啟發和幫助&#xff0c;還請留下你的一健三連&#xff0c;給我一些鼓勵&#xff0c;謝謝。 本文直…

解鎖 Zblog 資訊系統:502 錯誤修復與雙域名適配的實戰秘籍

在網絡世界的激烈競爭中&#xff0c;資訊類網站如同戰場上的士兵&#xff0c;每一次頁面加載、每一次內容展示都關乎著用戶的留存與轉化。而 Zblog 作為備受青睞的資訊系統&#xff0c;承載著眾多站長的流量夢想。然而&#xff0c;在網站運營過程中&#xff0c;502 錯誤頁面的突…

今日打卡,Leetcode第四題:尋找兩個正序數組的中位數,博主表示就會sorted

4. 尋找兩個正序數組的中位數 博主只會第一個暴力解法&#xff0c;然后將官網上的源碼上添加些注釋&#xff0c;嘗試理解&#xff0c;分下今日刷題記錄 題目描述 給定兩個大小分別為 m 和 n 的正序&#xff08;從小到大&#xff09;數組 nums1 和 nums2。請你找出并返回這兩個…

Jouier 普及組十連測 R3

反思 首先&#xff0c;先悔恨一下這次的比賽成績。 這次比賽的教訓就是&#xff0c;簡單的題目一定要打不要被復雜的題面震懾到&#xff0c;以及變量名不能是保留字&#xff0c;如第一題的x1,y1&#xff0c;要開long long&#xff0c;計算好數據范圍&#xff0c;如第三第四題。…

Open CASCADE學習|非線性方程組求解技術詳解

引言 在幾何建模與工程計算中&#xff0c;非線性方程組的求解是常見的核心問題。Open CASCADE&#xff08;以下簡稱OCC&#xff09;作為開源的幾何建模內核&#xff0c;提供了豐富的數學工具庫&#xff0c;其中math_FunctionSetRoot類專為求解非線性方程組設計。本文將深入探討…

科技初創企業創新推動商業未來

在這個因變革而蓬勃發展的世界里&#xff0c;科技初創企業已成為各行業創新、顛覆與轉型的驅動力。這些雄心勃勃的企業正在重塑商業格局&#xff0c;挑戰既定規范&#xff0c;并不斷突破可能性的邊界。本文將深入探索科技初創企業的精彩領域&#xff0c;探討它們如何通過創新塑…

霍尼韋爾HMR2300-D00-485數字模塊

型號&#xff1a;HMR2300-D00-485 類型&#xff1a;數字通信模塊&#xff08;RS-485接口&#xff09; 制造商&#xff1a;霍尼韋爾&#xff08;Honeywell&#xff09;&#xff0c;隸屬于其工業自動化或樓宇自動化產品線。 典型用途&#xff1a; 用于擴展主控制器&#xff08;如…

如何在 Windows 11 或 10 上更改 WIFI 或以太網 MAC 地址?

無論你使用的是哪種操作系統,更改 MAC 地址在各種場景中都有其益處。每個網卡的 MAC 地址都是唯一的,由網絡適配器在出廠時就已經分配完成;它幫助系統在物理網絡上進行通信,并為其提供身份識別。然而,如果你出于某種合法原因想要更改 Windows 上的當前 MAC 地址,那么我們…

Python語法特點與編碼規范

注釋 單行注釋 把#號當做注釋符號 多行注釋 python中并沒有規定多行注釋標記&#xff0c;通常使用單引號作為多行注釋 中文注釋 規定文件所用編碼&#xff0c;當時是為解決python2不支持中文的問題 #codingutf-8代碼縮進 python采用代碼縮進和冒號區分代碼層次&#xff0c…

跟Gemini學做PPT:字號選擇

字號的選擇對于 PPT 的可讀性和視覺效果至關重要。以下是一些通用的建議和針對你具體情況的字號選擇指南&#xff1a; 通用字號選擇原則&#xff1a; 對比度&#xff1a; 文字顏色與背景顏色形成高對比度&#xff0c;確保易讀。字體&#xff1a; 選擇清晰、專業的字體&#x…