以下是一個詳細全面的 Spring Boot 使用 WebSocket 的知識點彙總 1. 配置 WebSocket 添加依賴 進入maven官網, 搜索spring-boot-starter-websocket,選擇版本, 然後把依賴複製到pom.xml的dependencies標簽中 配置 We ...
以下是一個詳細全面的 Spring Boot 使用 WebSocket 的知識點彙總
1. 配置 WebSocket
添加依賴
進入maven官網, 搜索spring-boot-starter-websocket
,選擇版本, 然後把依賴複製到pom.xml的dependencies
標簽中
配置 WebSocket
創建一個配置類 WebSocketConfig
,並啟用 WebSocket 支持:
這個類的主要作用就是
- 啟用 WebSocket 支持: 這個配置類通過返回 ServerEndpointExporter 實例來啟用 WebSocket 支持。
- 自動註冊端點: 它會自動註冊用
@ServerEndpoint
註解標識的 WebSocket 端點,使它們能夠處理 WebSocket 請求。
package com.example.websocketdemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
2. 創建 WebSocket 端點
創建一個 WebSocket 端點 WebSocketServer
,處理客戶端與伺服器之間的 WebSocket 通信。
當一個用戶向服務端發送socket連接時, 相當於創建了一個WebSocketServer
類的實例對象
代碼中的Session
放到文章最後講。
package com.example.websocketdemo.websocket;
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
@Component // 下麵路徑最後面不要寫 '/'這個符號
@ServerEndpoint("/websocket/{username}") // 我們配置的有WebSocketConfig類, 所以可以使用這個註解
public class WebSocketServer {
private Session session;
@OnOpen // 建立連接的時候會調用這個函數
public void onOpen(Session session, @PathParam("username") String username) {
this.session = session;
System.out.println("Connected with username: " + username);
}
@OnMessage // 接收到客戶端的信息時調用
public void onMessage(String message, Session session) {
System.out.println("Received message: " + message);
try {
session.getBasicRemote().sendText("Server received [" + message + "]");
} catch (IOException e) {
e.printStackTrace();
}
}
@OnClose // 關閉連接的時候調用
public void onClose(Session session) {
System.out.println("Session closed");
}
@OnError // 錯誤時調用
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
}
}
3. Spring Security 配置(可選)
如果你的應用使用了 Spring Security,可能需要配置忽略 WebSocket 端點的安全檢查:
需要在你的SecurityConfig
類中添加下麵內容才可以讓伺服器接收到websocket的請求。SecurityConfig
是一個管理Spring Security
的自定義類
package com.example.websocketdemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
@Configuration
public class SecurityConfig {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().requestMatchers("/websocket/**");
}
}
4. 客戶端代碼
可以使用 JavaScript 在前端與 WebSocket 伺服器進行通信。
<script>
let socket = null;
function connect() {
let username = "your user name";
// @ServerEndpoint("/websocket/{username}") 這裡也可以傳遞其他參數, 比如token, 它會被服務端的這個註解接收到
socket = new WebSocket('ws://localhost:8080/websocket/' + username);
// 建立連接時會調用
socket.onopen = function(event) {
};
// 接收到服務端的信息時調用
socket.onmessage = function(event) {
};
// 關閉連接時調用
socket.onclose = function(event) {
};
// 錯誤時調用
socket.onerror = function(event) {
};
// 也可以通過close()手動關閉連接, 他會調用onclose(), 一般vue中在取消掛在組件時手動關閉連接
socket.close();
// 向服務端發送信息, message最好是json格式, JSON.stringify()
socket.send(message)
}
</script>
5. 處理 JSON 消息
在信息交換的時候, 我們一般用JSON格式的信息。Java 標準庫中並不包含直接處理 JSON 的功能。因此,需要引入第三方庫來處理 JSON 數據。
這裡我們講的是 Alibaba 提供的 fastjson
, 還是在 maven官網 搜索 fastjson
選擇對應版本, 引入到pom.xml的dependencies
標簽中。
// 將 Java 對象序列化為 JSON 字元串
String jsonString = JSON.toJSONString(user);
// 將 JSON 字元串反序列化為 Java 對象
User deserializedUser = JSON.parseObject(jsonString, User.class);
// 創建一個 JSONObject
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "John");
// 轉換成JSON字元串
jsonObject.toString()
// 解析 JSON 字元串
String jsonString = "{\"name\":\"ld\",\"age\":18,\"city\":\"ShangHai\"}";
JSONObject parsedObject = JSONObject.parseObject(jsonString);
// 獲取value, 輸出 ld
System.out.println("Name: " + parsedObject.getString("name"));
6. Session
Session
在 WebSocket 中是一個重要的概念,它代表了客戶端和伺服器之間的 WebSocket 連接。通過 Session
對象,你可以發送和接收消息、獲取連接信息、管理連接狀態以及處理連接中的錯誤。
1. 創建 WebSocket 伺服器端點
在 Java 中使用 WebSocket 的第一步是創建一個 WebSocket 伺服器端點。通過使用 @ServerEndpoint
註解,你可以定義 WebSocket 伺服器端點,並處理連接、關閉、消息和錯誤事件。
示例代碼:
import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
import java.io.IOException;
@ServerEndpoint("/websocket")
public class WebSocketServer {
@OnOpen
public void onOpen(Session session) {
System.out.println("Connected: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
System.out.println("Received: " + message);
session.getBasicRemote().sendText("Echo: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("Disconnected: " + session.getId());
}
@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
}
}
2. Session 對象的常用方法
- 獲取連接的唯一 ID:
session.getId()
- 發送消息:
- 發送文本消息:
session.getBasicRemote().sendText("message")
- 發送二進位消息:
session.getBasicRemote().sendBinary(ByteBuffer buffer)
- 發送文本消息:
- 獲取連接的基本信息:
- 獲取連接的 URI:
session.getRequestURI()
- 獲取連接的參數:
session.getPathParameters()
- 獲取連接的請求參數:
session.getRequestParameterMap()
- 獲取連接的 URI:
- 關閉連接:
session.close()
- 檢查連接狀態:
session.isOpen()
3. 處理消息
在 WebSocket 中,處理消息是通過 @OnMessage
註解的方法實現的。你可以在這個方法中處理來自客戶端的消息,並使用 Session
對象發送響應。
示例代碼:
@OnMessage
public void onMessage(String message, Session session) throws IOException {
System.out.println("Received: " + message);
// 向客戶端發送回顯消息
session.getBasicRemote().sendText("Echo: " + message);
}
4. 處理連接和斷開
@OnOpen
和 @OnClose
註解的方法分別用於處理連接建立和連接斷開事件。在這些方法中,你可以執行一些初始化或清理操作。
示例代碼:
@OnOpen
public void onOpen(Session session) {
System.out.println("Connected: " + session.getId());
}
@OnClose
public void onClose(Session session) {
System.out.println("Disconnected: " + session.getId());
}
5. 處理錯誤
@OnError
註解的方法用於處理 WebSocket 連接中的錯誤。在這個方法中,你可以記錄錯誤信息或執行其他的錯誤處理操作。
示例代碼:
@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
}
6. 使用 Session 進行高級操作
6.1 保存和共用用戶狀態
在 WebSocket 應用中,你可以使用 Session
對象來保存和共用用戶狀態。例如,你可以在 Session
對象中存儲用戶的身份信息,併在後續的消息處理中使用這些信息。
示例代碼:
@OnOpen
public void onOpen(Session session) {
session.getUserProperties().put("username", "John");
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
String username = (String) session.getUserProperties().get("username");
session.getBasicRemote().sendText("Hello, " + username + "! You sent: " + message);
}
6.2 廣播消息
你可以使用 Session
對象的集合來實現消息的廣播,即將消息發送給所有連接的客戶端。
示例代碼:
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@ServerEndpoint("/websocket")
public class WebSocketServer {
private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
System.out.println("Connected: " + session.getId());
}
@OnClose
public void onClose(Session session) {
sessions.remove(session);
System.out.println("Disconnected: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
for (Session s : sessions) {
if (s.isOpen()) {
s.getBasicRemote().sendText("Broadcast: " + message);
}
}
}
@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
}
}
文章到這裡就這束了!~
其他文章地址: