下面是“SpringBoot整合WebSocket实现后端向前端发送消息的实例代码”的完整攻略:
1. 引入相关依赖
首先,我们需要在SpringBoot的项目中引入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2. 配置WebSocket
在SpringBoot的配置文件中,加入以下配置:
# 配置WebSocket
server.endpoint.prefix=/server
spring.mvc.websocket.path=/websocket
其中,server.endpoint.prefix
表示WebSocket的服务前缀,一般为/server
,spring.mvc.websocket.path
表示WebSocket的请求路径,一般为/websocket
。
3. 编写WebSocket处理器
接下来,我们需要编写WebSocket的处理器。首先创建一个类,命名为MyHandler
,并实现WebSocketHandler
接口。在该类中,我们需要重写afterConnectionEstablished
、handleTextMessage
和afterConnectionClosed
等方法:
@Component
public class MyHandler implements WebSocketHandler {
private static final List<WebSocketSession> SESSIONS = new ArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
SESSIONS.add(session);
System.out.println("连接建立:" + session.getId());
}
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
for (WebSocketSession webSocketSession : SESSIONS) {
if (webSocketSession.isOpen()) {
webSocketSession.sendMessage(new TextMessage(payload));
}
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
SESSIONS.remove(session);
System.out.println("连接关闭:" + session.getId());
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if (session.isOpen()) {
session.close();
}
SESSIONS.remove(session);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
在以上代码中,我们定义了一个SESSIONS
列表,用于保存所有连接的WebSocketSession
实例。在afterConnectionEstablished
方法中,我们将当前连接的WebSocketSession
对象添加到列表中,并打印连接建立的信息。在handleTextMessage
方法中,我们遍历所有连接的WebSocketSession
对象,将收到的消息发送给所有客户端。在afterConnectionClosed
方法中,我们将关闭的WebSocketSession
对象从列表中移除,并打印连接关闭的信息。在handleTransportError
方法中,如果连接出现异常,我们需要将其关闭,并从列表中移除。最后,在supportsPartialMessages
方法中返回false
表示不支持分段传输消息。
4. 配置WebSocket拦截器
接着,在SpringBoot的配置类中,添加WebSocket的拦截器:
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
private MyHandler myHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler, "/websocket").addInterceptors(new HandshakeInterceptor() {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Map<String, Object> attributes) throws Exception {
System.out.println("握手前:" + request.getURI());
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Exception e) {
System.out.println("握手后:" + request.getURI());
}
});
}
}
在以上代码中,我们首先自动注入MyHandler
处理器,然后在registerWebSocketHandlers
方法中,对WebSocket的请求路径和处理器进行了注册,并添加了一个握手拦截器,用于在握手前和握手后做一些相关操作。
5. 前端页面
最后,我们需要编写前端页面来测试WebSocket的功能。在页面中,我们需要定义一个WebSocket对象,然后通过该对象与WebSocket服务器建立连接,并监听服务器发送的消息:
var socket;
if (!window.WebSocket) {
console.log("浏览器不支持WebSocket");
} else {
socket = new WebSocket("ws://localhost:8080/server/websocket");
socket.onopen = function () {
console.log("连接成功");
};
socket.onmessage = function (event) {
console.log("收到消息:" + event.data);
};
socket.onclose = function () {
console.log("连接关闭");
};
socket.onerror = function () {
console.log("连接异常");
};
}
在以上代码中,我们首先判断浏览器是否支持WebSocket,然后使用new WebSocket()
函数创建一个WebSocket对象,指定连接的服务端地址为ws://localhost:8080/server/websocket
,其中/server
表示WebSocket的服务前缀,/websocket
表示WebSocket的请求路径。接着,我们通过WebSocket对象的onopen
、onmessage
、onclose
和onerror
属性对WebSocket的相关事件进行监听和处理。
示例说明
示例一:发送消息
我们可以在前端页面的控制台中输入以下代码,向WebSocket服务器发送消息:
socket.send("Hello, WebSocket");
后端控制台会输出以下信息:
连接建立:ddc9ee55-14e8-1d26-3564-ae8b8667efc7
收到消息:Hello, WebSocket
前端控制台会输出以下信息:
连接成功
示例二:断开连接
我们也可以在前端页面的控制台中输入以下代码,手动断开WebSocket连接:
socket.close();
后端控制台会输出以下信息:
连接关闭:ddc9ee55-14e8-1d26-3564-ae8b8667efc7
前端控制台会输出以下信息:
连接关闭
这就是整合SpringBoot与WebSocket实现后端向前端发送消息的完整攻略,包括依赖引入、WebSocket配置、WebSocket处理器编写、WebSocket拦截器和前端页面示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合WebSocket实现后端向前端发送消息的实例代码 - Python技术站