持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
springboot结合websocket支持多路径连接
前文
本文内容为实际遇到的一个需求。在一个采用springboot结合原生websocket的项目中,需要同一个客户端进行多个socket连接,但连接地址有所不同。而下文内容也就是对于项目中部分内容的改造,以实现该目标需求。
基础配置信息及服务代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
首先需要对于websocket相关的jar包进行引入,并进行相关的属性设置,此处不再进行详细叙述。
@ServerEndpoint(value = "/websocket/monitor/{type}",encoders = {WebSocketEncode.class})
@Component
public class WebSocketServer {
@OnOpen
public void onOpen(Session session) {
}
@OnClose
public void onClose() {
}
@OnMessage
public void onMessage(String message) throws Exception {
}
@OnError
public void onError(Throwable error) {
}
}
如上述的代码所示,想要进行websocket的连接,需要采用@ServerEndpoint注解将其标记为wensocket的服务端。并通过对于开启连接、关闭连接、接收消息等内容的监听,实现具体的数据处理。通常来说websocket使用过程中会采用相同的连接地址,并当接收到消息时,根据路由的不同完成对于消息实际处理结构的路由。而当前我们的需求需要同一客户端采用不同的地址连接,因此将@ServerEndpoint注解中的内容由固定地址修改为通配的方式。type用于记录实际的消息连接类型。这种写法与实际上常用的restApi请求中路径参数类似,直接降需要的参数拼接到指定的位置即可。
String type = this.getSocketConnType(session.getRequestURI().getPath());
而实际上如何进行路径的处理呢?这里主要是通过连接的session获取实际的连接地址信息。如上代码所示,例如我们的连接地址为ws://127.0.0.1:8085/websocket/monitor/test,实际此处便可以获得type类型为test,并根据实际的需求通过对于类型的处理完成路由的操作。
如上两图所示,为一部分的测试数据。当我们通过不停的type进行连接后,能够得到不同的websocket推送数据结果。以此方式即可实现通过连接地址的路由处理。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。