前言
本文将给出SpringBoot整合WebSocket的两种方式,一种使用原生的注解,一种使用的是Spring封装后的WebSocket。
方式一:原生注解
依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
代码
1. 编写WebSocket的服务端点
注意:每一个WebSocket连接都会有它自己的ServerEndpoint
/*
WebSocket连接的路由,如ws://127.0.0.1:8080/websocket
支持路径参数,如/websocket/{id}
*/
//@Component //使用此注解Spring将自动注册ServerEndpoint
@ServerEndpoint("/websocket")
public class WebSocketEndpoint {
private static final Logger log = LoggerFactory.getLogger(WebSocketEndpoint.class);
/*
若有路径参数则使用 @PathParam 注解来获取变量
*/
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
log.info("WebSocket连接建立");
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
log.info("WebSocket连接关闭");
}
@OnError
public void onError(Session session, Throwable throwable) {
log.warn("WebSocket连接异常:" + throwable);
}
@OnMessage
public void onMessage(String message, Session session) {
log.info("WebSocket消息:" + message);
}
}
2. 编写WebSocket配置类
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
ServerEndpointExporter exporter = new ServerEndpointExporter();
// 手动注册ServerEndpoint
exporter.setAnnotatedEndpointClasses(WebSocketEndpoint.class);
return exporter;
}
}
测试
1. 启动SpringBoot服务
2. 通过在线websocket测试-在线工具-postjson (coolaf.com)进行测试
3. 后台输出:
方式二:Spring封装
依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
代码
1. 编写WebSocketHandler
// 这里的Handler更像是ServerEndpoint
// 需要实现WebSocketHandler接口,或者扩展TextWebSocketHandler或BinaryWebSocketHandler
public class MyWebSocketHandler extends TextWebSocketHandler {
private static final Logger log = LoggerFactory.getLogger(TextWebSocketHandler.class);
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
log.info("message: " + message.getPayload());
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("afterConnectionEstablished: " + session.getId());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info("afterConnectionClosed: " + session.getId());
}
}
2. 编写WebSocket配置类
@Configuration
@EnableWebSocket // 使用注解开启WebSocket功能
// 实现WebSocketConfigurer接口并重写registerWebSocketHandlers方法
public class WebSocketConfig implements WebSocketConfigurer {
@Bean
public MyWebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry
// 注册WebSocketHandler ,/websocket是通讯的路径,例如ws://127.0.0.1:8080/websocket
.addHandler(myWebSocketHandler(), "/websocket")
// 可以设置拦截器 它们会在 WebSocket握手请求的时候生效
// .addInterceptors()
// 跨域设置
.setAllowedOriginPatterns("*");
}
}
测试
1. 启动SpringBoot服务
2. 通过在线websocket测试-在线工具-postjson (coolaf.com)进行测试
3. 后台输出
参考资料
[1] 在 Spring Boot 中整合、使用 WebSocket - spring 中文网 (springdoc.cn)
[2] Servlet 栈的 Web 应用 (springdoc.cn)
[3] 【websocket】spring boot 集成 websocket 的四种方式-腾讯云开发者社区-腾讯云 (tencent.com)
示例代码
SpringBoot-WebSocket-Demo: 两种方式(原生注解和Spring封装)实现的WebSocket通信的示例 (gitee.com)