SpringBoot中使用原生WebSocket詳解
SpringBoot中使用原生WebSocket
在Spring Boot中使用原生WebSocket(不使用STOMP協(xié)議)可以簡(jiǎn)化一些場(chǎng)景下的實(shí)現(xiàn),尤其是在不需要消息代理或復(fù)雜的消息格式時(shí)。
下面是集成原生WebSocket到Spring Boot項(xiàng)目中的步驟:
添加依賴
確保你的pom.xml文件中包含了WebSocket的支持。
<dependencies>
<!-- Spring Boot Starter WebSocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
</dependencies>
配置WebSocket
創(chuàng)建一個(gè)配置類來啟用WebSocket支持并注冊(cè)端點(diǎn)。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 注冊(cè)WebSocket處理器,并設(shè)置跨域訪問
registry.addHandler(myWebSocketHandler(), "/ws").setAllowedOrigins("*");
}
public MyWebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
}
創(chuàng)建WebSocket處理器
定義一個(gè)處理器來處理WebSocket連接、接收消息和關(guān)閉連接等事件。
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 當(dāng)建立連接后調(diào)用
System.out.println("Connection established: " + session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// 收到文本消息時(shí)調(diào)用
String payload = message.getPayload();
System.out.println("Received message: " + payload);
// 回應(yīng)客戶端
session.sendMessage(new TextMessage("Echo: " + payload));
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
// 連接關(guān)閉后調(diào)用
System.out.println("Connection closed: " + session);
}
}
前端代碼示例 (JavaScript)
前端可以通過JavaScript直接與WebSocket服務(wù)器交互,無需額外的庫。
<!DOCTYPE html>
<html>
<head>
<title>Native WebSocket Example</title>
</head>
<body>
<input type="text" id="message"/>
<button onclick="sendMessage()">Send</button>
<ul id="messages"></ul>
<script type="text/javascript">
var ws = null;
function connect() {
// 連接到WebSocket服務(wù)器
ws = new WebSocket('ws://localhost:8080/ws');
ws.onopen = function() {
console.log('Connected to server');
};
ws.onmessage = function(event) {
// 接收到服務(wù)器的消息時(shí)調(diào)用
var messages = document.getElementById('messages');
var messageElement = document.createElement('li');
messageElement.textContent = event.data;
messages.appendChild(messageElement);
};
ws.onclose = function() {
console.log('Disconnected from server');
};
}
function sendMessage() {
var messageContent = document.getElementById('message').value;
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send(messageContent);
}
}
window.onload = connect; // 頁面加載完成后連接
</script>
</body>
</html>
這段代碼展示了如何使用原生的WebSocket API建立連接、發(fā)送消息以及接收來自服務(wù)器的消息。這里沒有使用SockJS或STOMP,更適合于簡(jiǎn)單的雙向通信場(chǎng)景。
以上就是Spring Boot中集成原生WebSocket的基本過程。根據(jù)你的需求,你可能還需要添加更多功能,比如身份驗(yàn)證、錯(cuò)誤處理等。此外,請(qǐng)注意設(shè)置合適的跨域策略,以確保WebSocket的安全性。
如何通過MyWebSocketHandler接受前端傳過來的參數(shù)處理文本或二進(jìn)制消息?
直接使用WebSocketHandler
不使用STOMP協(xié)議,直接使用WebSocketHandler,可以通過覆蓋handleTextMessage方法來處理從客戶端發(fā)送來的消息。在這個(gè)方法中,可以解析消息內(nèi)容并提取出參數(shù)。
后端代碼示例(Java)
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyWebSocketHandler extends TextWebSocketHandler {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// 解析消息內(nèi)容
String payload = message.getPayload();
// 這里可以將payload轉(zhuǎn)換為JSON對(duì)象,然后獲取參數(shù)
// 假設(shè)我們有一個(gè)工具類JsonUtil可以進(jìn)行JSON解析
Map<String, Object> params = JsonUtil.parse(payload, Map.class);
// 根據(jù)參數(shù)做相應(yīng)的處理...
// 如果需要響應(yīng)客戶端,可以使用session.sendMessage(new TextMessage(response));
}
// ...其他必要的方法重寫
}
為了能夠解析JSON格式的消息體,你需要引入適當(dāng)?shù)囊蕾?,比如Jackson或者Gson等。如果你使用的是Maven構(gòu)建工具,可以在pom.xml中添加如下依賴:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 確保使用最新穩(wěn)定版本 -->
</dependency>
URL路徑/查詢參數(shù)
你也可以在WebSocket握手時(shí)通過URL路徑或查詢參數(shù)傳遞數(shù)據(jù)。這通常用于傳遞一些初始化信息,例如用戶ID、會(huì)話令牌等。
后端代碼示例(Java)
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 獲取URL中的查詢參數(shù)
MultiValueMap<String, String> queryParams = session.getUri().getQueryParams();
// 或者從path variables中獲取
// String userId = (String) session.getAttributes().get("userId");
super.afterConnectionEstablished(session);
}
// ...其他方法
}
在上述示例中,可以通過session.getUri()來獲取原始的WebSocket URL,并從中提取出任何路徑變量或查詢參數(shù)。
這些參數(shù)可以在連接建立后立即使用,或者存儲(chǔ)起來供后續(xù)消息處理時(shí)使用。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatisCodeHelperPro插件下載及使用教程詳解
這篇文章主要介紹了MyBatis CodeHelperPro插件使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09
基于spring+springmvc+hibernate 整合深入剖析
這篇文章主要介紹了于spring+springmvc+hibernate整合實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)的實(shí)現(xiàn)
堆(優(yōu)先隊(duì)列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹,一般用于求解topk問題。本文將利用Java語言實(shí)現(xiàn)堆,感興趣的可以學(xué)習(xí)一下2022-05-05
快速解決jdk初始化運(yùn)行,防火墻通信選錯(cuò)專業(yè)網(wǎng)絡(luò)的問題
新項(xiàng)目添加不同JDK版本時(shí)因防火墻通信策略導(dǎo)致外部連接失敗,解決方法為調(diào)整防火墻設(shè)置,允許應(yīng)用通過并將其設(shè)為公用網(wǎng)絡(luò),適用于多JDK環(huán)境2025-08-08
Java運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分原理解析
這篇文章主要介紹了Java運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

