参考链接:
1.https://www.cnblogs.com/goloving/p/14735257.html
2.https://zhuanlan.zhihu.com/p/371154698
3.https://www.cnblogs.com/goloving/p/10746378.html
测试网站:
1.https://wstool.js.org/
2.https://ws-tool.samler.cn/
一、JS端的常见分类
- WebSocket:底层的原始协议
- SockJS:为了应对许多浏览器不支持WebSocket协议的问题,设计了备选SockJs。SockJS 是 WebSocket 技术的一种模拟。SockJS会尽可能对应 WebSocket API,但如果WebSocket 技术不可用的话,会自动降为轮询的方式。
- STOMP:STOMP在WebSocket 之上提供了一个基于帧的线路格式层,消息格式为文本,可以实现发布/订阅模式,使得消息可以广播给多个客户端。
二、spring boot websocket常见分类
- ServerEndpointExporter:注册使用标准 Java API 编写的 WebSocket 端点。它主要用于纯 Java WebSocket 编程,不依赖于 Spring 的高级消息处理功能。
- WebSocketMessageBrokerConfigurer:允许你自定义配置基于消息代理的 WebSocket 设置。它是 Spring 的高级 WebSocket 消息处理配置的一部分,通常用于构建基于 STOMP 协议的 WebSocket 应用程序。
三、示例代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
@Configuration
public class WebSocketConfiguration {
@Bean
public ServerEndpointExporter serverEndpointExporter (){
ServerEndpointExporter exporter = new ServerEndpointExporter();
// 手动注册 WebSocket 端点
exporter.setAnnotatedEndpointClasses(EchoController.class);
return exporter;
}
}
@ServerEndpoint(value = "/channel/echo")
@Slf4j
public class EchoController {
private Session session;
// 收到消息
@OnMessage
public void onMessage(String message) throws IOException {
log.info("[websocket] 收到消息:id={},message={}", this.session.getId(), message);
if (message.equalsIgnoreCase("bye")) {
// 由服务器主动关闭连接。状态码为 NORMAL_CLOSURE(正常关闭)。
this.session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "Bye"));;
return;
}
this.session.getAsyncRemote().sendText("["+ Instant.now().toEpochMilli() +"] Hello " + message);
}
// 连接打开
@OnOpen
public void onOpen(Session session, EndpointConfig endpointConfig){
// 保存 session 到对象
this.session = session;
log.info("[websocket] 新的连接:id={}", this.session.getId());
}
// 连接关闭
@OnClose
public void onClose(CloseReason closeReason){
log.info("[websocket] 连接断开:id={},reason={}", this.session.getId(),closeReason);
}
// 连接异常
@OnError
public void onError(Throwable throwable) throws IOException {
log.info("[websocket] 连接异常:id={},throwable={}", this.session.getId(), throwable.getMessage());
// 关闭连接。状态码为 UNEXPECTED_CONDITION(意料之外的异常)
this.session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, throwable.getMessage()));
}
}
四、WebSocketMessageBrokerConfigurer测试
博主使用spring官方的demo进行了测试。
使用以下客户端,都可以连接到spring boot的websocket server上:
- stompjs 纯JS测试;
- stomp_ws Python端测试。
经验总结:
- spring ws server支持使用/topic/item/*,来实现模糊匹配;
- 如果相同客户端订阅了相同的Topic,则均能收到相同的数据;