在現代 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,我們需要手動初始化 DispatcherServlet
和 WebSocket
配置。
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 生態中的應用,為構建高效的實時系統打下堅實的基礎。