Spring 核心技術解析【純干貨版】- XVIII:Spring 網絡模塊 Spring-WebSocket 模塊精講

在現代 Web 開發中,實時通信已成為提升用戶體驗的關鍵技術之一。傳統的 HTTP 輪詢方式存在較高的延遲和帶寬開銷,而 WebSocket 作為一種全雙工通信協議,能夠在客戶端和服務器之間建立持久連接,實現高效的雙向數據傳輸。

Spring 框架在 WebSocket 方面提供了完善的支持,并通過 Spring-WebSocket 模塊簡化了 WebSocket 服務器的開發,使得開發者可以快速構建基于 WebSocket 的實時應用。

本文將深入解析 Spring-WebSocket 模塊,并提供一個完整的 WebSocket 聊天服務器示例,幫助開發者快速掌握 Spring WebSocket 的核心技術。


文章目錄

      • 1、Spring-WebSocket 模塊介紹
        • 1.1、Spring-WebSocket 模塊概述
        • 1.2、Spring-WebSocket 模塊依賴
        • 1.3、Spring-WebSocket 模塊作用
      • 2、Spring WebSocket 案例:一個簡單的 WebSocket 聊天服務器
        • 2.1、添加 Maven 依賴
        • 2.2、創建 WebSocket 處理器
        • 2.3、配置 WebSocket 服務器
        • 2.4、創建 Web 應用初始化類
        • 2.5、創建 WebSocket 客戶端(HTML+JavaScript)
        • 2.6、運行 WebSocket 服務器
        • 2.7、運行效果
      • X、后記


1、Spring-WebSocket 模塊介紹

1.1、Spring-WebSocket 模塊概述

Spring WebSocket 模塊,是 Spring 框架中用于支持 WebSocket 協議的部分,WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議,使得客戶端和服務器可以進行實時交互,常用于即時通訊、在線游戲、股票報價等場景。

1.2、Spring-WebSocket 模塊依賴

Spring-Web 模塊的依賴有兩個,分別是 Spring-Context 模塊和 Spring-Core 模塊和 Spring-Web 模塊。

其中 Spring Beans 模塊是對 Spring Bean 進行定義,實現 IOC 基礎功能的模塊。而 Spring-Core 是 Spring 中的基礎模塊,它提供了框架運行所必需的核心功能。

1.3、Spring-WebSocket 模塊作用

Spring-WebSocket 模塊作用:

  • 負責提供 WebSocket 協議的支持,實現雙向、實時的消息通信。
  • 適用于需要低延遲通信的應用,如在線聊天、股票行情推送、協作編輯等。
  • 允許基于 WebSocket 進行長連接通信,相比傳統 HTTP 輪詢方式更高效。
  • 可結合 STOMP 協議,實現基于消息隊列的 WebSocket 交互,增強可擴展性。

2、Spring WebSocket 案例:一個簡單的 WebSocket 聊天服務器

下面是一個基于 Spring-WebSocke t的 WebSocket 服務器示例。我們將手動配置 WebSocket,并使用 Spring WebSocket + Tomcat(或其他 Servlet 容器) 實現一個簡單的 WebSocket 聊天服務器。

功能:搭建 WebSocket 服務器,支持多個客戶端連接。客戶端可以向服務器發送消息,服務器會廣播該消息給所有連接的客戶端。

2.1、添加 Maven 依賴
<dependencies><!-- Spring WebSocket --><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>6.1.3</version></dependency><!-- Spring Web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>6.1.3</version></dependency><!-- Java WebSocket API --><dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version></dependency><!-- Tomcat WebSocket 實現 --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-websocket</artifactId><version>10.1.17</version></dependency>
</dependencies>
2.2、創建 WebSocket 處理器

我們需要實現 TextWebSocketHandler 來處理 WebSocket 消息。

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;public class ChatWebSocketHandler extends TextWebSocketHandler {private static final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());@Overridepublic void afterConnectionEstablished(WebSocketSession session) {sessions.add(session);System.out.println("新用戶連接: " + session.getId());}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {System.out.println("收到消息: " + message.getPayload());// 廣播消息給所有連接的客戶端for (WebSocketSession webSocketSession : sessions) {if (webSocketSession.isOpen()) {webSocketSession.sendMessage(new TextMessage("用戶 " + session.getId() + " 說: " + message.getPayload()));}}}@Overridepublic void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) {sessions.remove(session);System.out.println("用戶斷開: " + session.getId());}
}
2.3、配置 WebSocket 服務器

創建 WebSocket 配置類,注冊 WebSocket 處理器。

import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new ChatWebSocketHandler(), "/chat").setAllowedOrigins("*");}
}
2.4、創建 Web 應用初始化類

由于不使用 Spring Boot,我們需要手動初始化 DispatcherServletWebSocket 配置。

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;public class WebAppInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {// 創建 Spring 上下文AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(WebSocketConfig.class);// 創建 DispatcherServletServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));dispatcher.setLoadOnStartup(1);dispatcher.addMapping("/");}
}
2.5、創建 WebSocket 客戶端(HTML+JavaScript)

客戶端使用 HTML+JavaScript 連接 WebSocket 服務器,并發送/接收消息。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket 聊天</title>
</head>
<body><h2>WebSocket 聊天</h2><input type="text" id="message" placeholder="輸入消息"><button onclick="sendMessage()">發送</button><ul id="messages"></ul><script>const socket = new WebSocket("ws://localhost:8080/chat");socket.onopen = () => console.log("已連接 WebSocket 服務器");socket.onmessage = (event) => {const li = document.createElement("li");li.textContent = event.data;document.getElementById("messages").appendChild(li);};function sendMessage() {const message = document.getElementById("message").value;socket.send(message);}</script>
</body>
</html>
2.6、運行 WebSocket 服務器

部署到 Tomcat將代碼打包成 .war 部署到 Tomcat webapps 目錄下。啟動 Tomcat,訪問 http://localhost:8080/chat.html 進行測試。

使用 Jetty 運行:在 WebAppInitializer 中修改配置,改用 Jetty 服務器。

2.7、運行效果

訪問 http://localhost:8080/chat.html,打開多個瀏覽器窗口。在其中一個窗口輸入消息并發送,所有連接的客戶端都會收到廣播消息。


X、后記

通過本篇文章,我們深入探討了 Spring-WebSocket 模塊的基本概念、依賴配置、核心作用,并基于實際案例實現了一個簡單的 WebSocket 聊天服務器。

WebSocket 技術在即時通訊、協作應用、金融數據推送等領域有著廣泛的應用。掌握 Spring-WebSocket 后,開發者可以輕松構建高效的實時通信應用,并結合 STOMP、Spring Security 等技術,實現更復雜的 WebSocket 交互。

希望本文能幫助你更好地理解 WebSocket 在 Spring 生態中的應用,為構建高效的實時系統打下堅實的基礎。

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

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

相關文章

VirtualBox安裝FnOS

1.下載FnOS鏡像 下載網址&#xff1a; https://www.fnnas.com/2.創建虛擬機 虛擬機配置如圖所示&#xff08;注意操作系統類型和網卡配置&#xff09; &#xff08;注意啟動順序&#xff09; 3.啟動虛擬機 網卡類型選擇橋接的Virtual Adapter 如果沒有IP地址或者IP地址無法…

java根據集合中對象的屬性值大小生成排名

1&#xff1a;根據對象屬性降序排列 public static <T extends Comparable<? super T>> LinkedHashMap<T, Integer> calculateRanking(List<ProductPerformanceInfoVO> dataList, Function<ProductPerformanceInfoVO, T> keyExtractor) {Linked…

grep命令: 過濾

[rootxxx ~]# grep root /etc/passwd [rootxxx ~]# grep -A 2 root /etc/passwd -A #匹配行后兩行 [rootxxx ~]# grep -B 2 root /etc/passwd -B #匹配行前兩行 [rootxxx ~]# grep -C 2 root /etc/passwd -C #前后2行 [rootxxx ~]# grep -n root /…

二十種中藥果實識別分類系統,Python/resnet18/pytorch

二十種中藥果實識別分類系統,Python/resnet18/pytorch 基于pytorch訓練, resnet18網絡&#xff0c;可用于訓練其他分類問題&#xff0c;也可自己重新訓練 20類中藥材具體包括&#xff1a;(1) 補骨脂&#xff0c;(2) 草豆蔻&#xff0c;(3) 川楝子&#xff0c;(4) 地膚子&…

SpringBoot啟動run方法分析

SpringBoot啟動run方法分析 1.場景引入 在項目啟動的時候&#xff0c;有時候我們需要在啟動的時候&#xff0c;執行一些邏輯。 比如說&#xff0c;項目啟動的時候&#xff0c;我想把一些熱門商品的數據加載到緩存中去&#xff1b; 比如說&#xff0c;自定義了一個netty服務…

Linux信號——信號的處理(3)

信號是什么時候被處理&#xff1f; 進程從內核態&#xff0c;切換到用戶態的時候&#xff0c;信號會被檢測處理。 內核態&#xff1a;操作系統的狀態&#xff0c;權限級別高 用戶態&#xff1a;你自己的狀態 內核態和用戶態 進程地址空間第三次 所謂的系統調用本質其實是一堆…

MySQL篇(四)事務相關知識詳解

MySQL篇(四&#xff09;事務相關知識詳解 MySQL篇(四&#xff09;事務相關知識詳解一、事務的特性&#xff08;ACID&#xff09;原子性&#xff08;Atomicity&#xff09;一致性&#xff08;Consistency&#xff09;隔離性&#xff08;Isolation&#xff09;持久性&#xff08;…

SpringBoot定時任務深度優化指南

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 SpringBoot定時任務深度優化指南 引言 在分布式系統架構中&#xff0c;定時任務是實現業務邏輯自動化的重要組件。SpringBoot通過Scheduled注解提供了便捷的…

MySQL表結構導出(Excel)

目錄 一、java實現MySQL表結構導出&#xff08;Excel&#xff09; 二、python實現MySQL表結構導出&#xff08;Excel&#xff09; 又到了寫畢設的時候了&#xff0c;計算機專業在寫論文第四章系統設計的時候肯定會遇到和我一樣的難題——要在論文中將數據庫的表結構以表格形式…

Android使用OpenGL和MediaCodec渲染視頻

目錄 一&#xff0c;借助MediaCodec封裝解碼工具類VideoCodec 二&#xff0c;使用OpenGl繪制視頻封裝SoulFilter 一&#xff0c;借助MediaCodec封裝解碼工具類VideoCodec /*** 解碼工具類* 解碼完成后的數據 通過 ISurface 回調出去*/ public class VideoCodec {private ISu…

day39——輸入操作:多值輸入

數組輸入&#xff1a; int main() {//***** 1、多值輸入&#xff08;C&#xff09;/*輸入&#xff1a;3 --> 3個值5 4 9*/int n;cin >> n; //輸入個數const int MAX_SIZE 0xFFFF;//限定最大個數int a[MAX_SIZE];for (int i 0; i < n; i) {//用 n 作控制輸入…

第九課:LoRA模型的原理及應用

文章目錄 Part.01 3種LoRA的使用方式Part.02 5種LoRA的應用方向Part.01 3種LoRA的使用方式 LoRA能夠在家用級設備上訓練,實現對Checkpoint在某些方面的微調使用Lora的三種方式:放置Lora模型到目錄中,然后作為提示詞的一部分輸入。點擊生成按鈕下面的“畫”,然后打開Additio…

Cortex-M3 NVIC可以控制異常向量表的哪些部分

Cortex-M3 的 NVIC(嵌套向量中斷控制器)不直接控制整個異常向量表,但可以管理向量表中與中斷相關的部分行為。以下是 NVIC 對異常向量表的具體控制范圍和相關機制: 1. NVIC 直接控制的部分 NVIC 主要管理 外部中斷(IRQ) 和部分 系統異常 的行為,但對向量表本身的存儲位…

雙向鏈表增刪改查的模擬實現

本章目標 0.雙向鏈表的基本結構 1.雙向鏈表的初始化 2.頭插尾插 3.頭刪尾刪 4.查找與打印 5.在指定位置之前插入數據/在指定位置之后插入數據 6.在指定位置之前刪除數據/在指定位置之后刪除數據 7.銷毀鏈表 0.雙向鏈表的基本結構 本章所實現的雙向鏈表是雙向循環帶頭鏈表,是…

實戰交易策略 篇十四:江南神鷹捕捉熱點和熊市生存交易策略

文章目錄 系列文章捕捉熱點是股市最大的掘金術市場溫度不低于50是熱點產生的必要條件題材的大小和新穎程度決定熱點的持續時間和漲幅炒作熱點的3個階段捕捉熱點的方法與步驟操作實戰案例熊市生存術“熊市最好的做法是離開股市”的說法是一句空話熊市盈利模式:不輕言底部,超跌…

Linux錯誤(6)X64向量指令訪問地址未對齊引起SIGSEGV

Linux錯誤(6)X64向量指令訪問地址未對齊引起SIGSEGV Author: Once Day Date: 2025年4月4日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: Linux實…

解碼 __iter__ 和 itertools.islice - 迭代的藝術

文章目錄 前言一、`_iter__`:自定義迭代的鑰匙1.1 什么是 __iter__?1.2 基本用法1.3 高級用法:獨立迭代器二、itertools.islice:迭代切片的利器2.1 什么是 itertools.islice?2.2 基本用法2.3 處理無限序列2.4 實際應用三、`__iter__` 與 `islice` 的結合六、為什么需要它們…

使用VSCode編寫C#程序

目錄 一、環境搭建&#xff1a;構建高效開發基礎1. 安裝VSCode2. 配置.NET SDK3. 安裝核心擴展 二、項目開發全流程1. 創建項目2. 代碼編輯技巧3. 調試配置4. 高級調試技巧5. 編譯與運行 三、常見問題解決指南1. 項目加載失敗2. IntelliSense失效3. 代碼格式化4. 典型編譯錯誤&…

日本汽車規模性經濟計劃失敗,日產三大品牌的合并合作共贏,還是絕地求生?本田與日產合并確認失敗,將成為世界第三大汽車集團愿景失敗

本田與日產(含三菱汽車)的合并計劃最終因核心矛盾無法調和而宣告失敗,這一事件揭示了傳統車企在行業變革期的深層困境。以下從合并動機、失敗原因、本質判斷及未來影響等方面綜合分析: 一、合并的初衷:生存壓力主導的被動策略 市場危機與財務困境 中國市場潰敗:日系品牌在…

AutoCAD2026中文版下載安裝教程

AutoCAD是一款由Autodesk公司開發的計算機輔助設計軟件&#xff0c;被廣泛應用于建筑設計、機械設計、電氣設計、土木工程、裝飾裝潢等多個領域。AutoCAD2026中文版在原有的基礎上進行了多項改進和優化&#xff0c;為用戶提供了更為高效、便捷的繪圖和設計體驗。這里我給大家分…