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è)配置類來(lái)啟用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è)置跨域訪問(wèn)
registry.addHandler(myWebSocketHandler(), "/ws").setAllowedOrigins("*");
}
public MyWebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
}
創(chuàng)建WebSocket處理器
定義一個(gè)處理器來(lái)處理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)
前端可以通過(guò)JavaScript直接與WebSocket服務(wù)器交互,無(wú)需額外的庫(kù)。
<!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; // 頁(yè)面加載完成后連接
</script>
</body>
</html>
這段代碼展示了如何使用原生的WebSocket API建立連接、發(fā)送消息以及接收來(lái)自服務(wù)器的消息。這里沒(méi)有使用SockJS或STOMP,更適合于簡(jiǎn)單的雙向通信場(chǎng)景。
以上就是Spring Boot中集成原生WebSocket的基本過(guò)程。根據(jù)你的需求,你可能還需要添加更多功能,比如身份驗(yàn)證、錯(cuò)誤處理等。此外,請(qǐng)注意設(shè)置合適的跨域策略,以確保WebSocket的安全性。
如何通過(guò)MyWebSocketHandler接受前端傳過(guò)來(lái)的參數(shù)處理文本或二進(jìn)制消息?
直接使用WebSocketHandler
不使用STOMP協(xié)議,直接使用WebSocketHandler,可以通過(guò)覆蓋handleTextMessage方法來(lái)處理從客戶端發(fā)送來(lái)的消息。在這個(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í)通過(guò)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);
}
// ...其他方法
}
在上述示例中,可以通過(guò)session.getUri()來(lái)獲取原始的WebSocket URL,并從中提取出任何路徑變量或查詢參數(shù)。
這些參數(shù)可以在連接建立后立即使用,或者存儲(chǔ)起來(lái)供后續(xù)消息處理時(shí)使用。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用hutool實(shí)現(xiàn)文件大小的友好輸出
這篇文章主要為大家詳細(xì)介紹了Java如何使用hutool實(shí)現(xiàn)文件大小的友好輸出,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-11-11
java序列化和serialVersionUID的使用方法實(shí)例
這篇文章主要介紹了java序列化和serialVersionUID的使用方法實(shí)例的相關(guān)資料,這里說(shuō)明很詳細(xì)的使用方法讓你徹底學(xué)會(huì),需要的朋友可以參考下2017-08-08
Java設(shè)置Access-Control-Allow-Origin允許多域名訪問(wèn)的實(shí)現(xiàn)方法
這篇文章主要介紹了Java設(shè)置Access-Control-Allow-Origin允許多域名訪問(wèn)的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
Spring 使用 feign時(shí)設(shè)置header信息的操作
這篇文章主要介紹了Spring 使用 feign時(shí)設(shè)置header信息的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
如何通過(guò)SpringBoot實(shí)現(xiàn)商城秒殺系統(tǒng)
這篇文章主要介紹了如何通過(guò)SpringBoot實(shí)現(xiàn)商城秒殺系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法
這篇文章主要介紹了Java?從json提取出數(shù)組并轉(zhuǎn)換為list,使用getJSONArray()獲取到j(luò)sonarray后,再將jsonArray轉(zhuǎn)換為字符串,最后將字符串解析為L(zhǎng)ist列表,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10
Java結(jié)合JS實(shí)現(xiàn)URL編碼與解碼
這篇文章介紹了Java結(jié)合JS實(shí)現(xiàn)URL編碼與解碼的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
詳解Spring Kafka中關(guān)于Kafka的配置參數(shù)
這篇文章主要介紹了詳解Spring Kafka中關(guān)于Kafka的配置參數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08

