WebSocket 在 Spring Boot 中的高级应用指南
深入理解WebSocket协议
深入理解STOMP协议
1. 概述
WebSocket 是一种基于 TCP 的全双工通信协议,允许服务器和客户端之间进行持续的双向通信。与传统的 HTTP 请求-响应模型不同,WebSocket 是一个持久的连接,可以在服务器和客户端之间进行实时数据交换,特别适用于需要频繁更新的场景,比如实时聊天、在线游戏、金融市场数据等。
在 Spring Boot 中,WebSocket 有多种实现方式,开发者可以根据具体的业务需求选择合适的方式。本文将详细介绍以下三种 WebSocket 的实现方式:
- 基于注解的 JSR 356 标准实现。
- 基于 Spring 的
WebSocketHandler
接口实现。 - 基于 STOMP 协议的实现。
通过这些不同的方式,开发者能够灵活地实现实时通信,满足各种场景下的需求。
2. 基于注解的 JSR 356 实现
JSR 356 是 Java 的标准 WebSocket API,它允许开发者使用注解来处理 WebSocket 的连接、消息传递和关闭等事件。JSR 356 的实现方式非常直观,适合轻量级的 WebSocket 应用。
2.1 配置与实现
依赖添加:
在 pom.xml
中添加 WebSocket 相关的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
WebSocket 配置类:
为了让 Spring Boot 支持 WebSocket,我们需要配置一个 ServerEndpointExporter
,它会自动注册所有标注了 @ServerEndpoint
的类。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
// 启用 WebSocket 支持,自动扫描并注册 @ServerEndpoint 注解的类
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
WebSocket 服务端实现类:
使用 @ServerEndpoint
注解来指定 WebSocket 端点路径,处理客户端的连接、消息和关闭事件。
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
@ServerEndpoint("/ws")
public class WebSocketServer {
// 存储所有的 WebSocket 客户端连接
private static final CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
private Session session; // 当前会话的连接
/**
* 客户端连接建立时调用
* @param session WebSocket 会话
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this); // 将新的连接加入集合
System.out.println("新连接建立: " + session.getId());
sendMessage("连接成功");
}
/**
* 客户端发送消息时调用
* @param message 客户端发来的消息
*/
@OnMessage
public void onMessage(String message) {
System.out.println("收到消息: " + message + " 来自: " + session.getId());
// 广播消息给所有连接的客户端
for (WebSocketServer webSocket : webSocketSet) {
try {
webSocket.sendMessage("服务器收到消息: " + message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 客户端断开连接时调用
* @param session WebSocket 会话
*/
@OnClose
public void onClose(Session session) {
webSocketSet.remove(this); // 连接关闭时移除
System.out.println("连接关闭: " + session.getId());
}