实战 | spring boot 集成 websocket 的四种方式
SpringBoot集成websocket的四种方式
原生注解
pom.xml
WebSocketConfig
说明:
这个配置类很简单,通过这个配置 spring boot 才能去扫描后面的关于 websocket 的注解
WsServerEndpoint
说明
这里有几个注解需要注意一下,首先是他们的包都在 **javax.websocket **下。并不是 spring 提供的,而 jdk 自带的,下面是他们的具体作用。
- @ServerEndpoint
- 通过这个 spring boot 就可以知道你暴露出去的 ws 应用的路径,有点类似我们经常用的@RequestMapping。比如你的启动端口是 8080,而这个注解的值是 ws,那我们就可以通过 ws://127.0.0.1:8080/ws 来连接你的应用
- @OnOpen
- 当 websocket 建立连接成功后会触发这个注解修饰的方法,注意它有一个 Session 参数
- @OnClose
- 当 websocket 建立的连接断开后会触发这个注解修饰的方法,注意它有一个 Session 参数
- @OnMessage
- 当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值
- @OnError
- 当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数
另外一点就是服务端如何发送消息给客户端,服务端发送消息必须通过上面说的 Session 类,通常是在@OnOpen 方法中,当连接成功后把 session 存入 Map 的 value,key 是与 session 对应的用户标识,当要发送的时候通过 key 获得 session 再发送,这里可以通过 session.getBasicRemote().sendText(*) * 来对客户端发送消息。
Spring 封装
pom.xml
HttpAuthHandler
说明
通过继承 TextWebSocketHandler 类并覆盖相应方法,可以对 websocket 的事件进行处理,这里可以同原生注解的那几个注解连起来看
- afterConnectionEstablished 方法是在 socket 连接成功后被触发,同原生注解里的 @OnOpen 功能
- **afterConnectionClosed **方法是在 socket 连接关闭后被触发,同原生注解里的 @OnClose 功能
- **handleTextMessage **方法是在客户端发送信息时触发,同原生注解里的 @OnMessage 功能
WsSessionManager
说明
这里简单通过 **ConcurrentHashMap **来实现了一个 session 池,用来保存已经登录的 web socket 的 session。前文提过,服务端发送消息给客户端必须要通过这个 session。
MyInterceptor
说明
通过实现 HandshakeInterceptor 接口来定义握手拦截器,注意这里与上面 Handler 的事件是不同的,这里是建立握手时的事件,分为握手前与握手后,而 Handler 的事件是在握手成功后的基础上建立 socket 的连接。所以在如果把认证放在这个步骤相对来说最节省服务器资源。它主要有两个方法 beforeHandshake 与 **afterHandshake **,顾名思义一个在握手前触发,一个在握手后触发。
WebSocketConfig
说明
通过实现 WebSocketConfigurer 类并覆盖相应的方法进行 websocket 的配置。我们主要覆盖 registerWebSocketHandlers 这个方法。通过向 WebSocketHandlerRegistry 设置不同参数来进行配置。其中 **addHandler **方法添加我们上面的写的 ws 的 handler 处理类,第二个参数是你暴露出的 ws 路径。**addInterceptors **添加我们写的握手过滤器。**setAllowedOrigins("*") **这个是关闭跨域校验,方便本地调试,线上推荐打开。
3. TIO
pom.xml
application.xml
说明
这里只配置了 ws 的启动端口,还有很多配置,可以通过结尾给的链接去寻找
MyHandler
说明
这个同上个例子中的 handler 很像,也是通过实现接口覆盖方法来进行事件处理,实现的接口是 IWsMsgHandler ,它的方法功能如下
- handshake
- 在握手的时候触发
- onAfterHandshaked
- 在握手成功后触发
- onBytes
- 客户端发送二进制消息触发
- onClose
- 客户端关闭连接时触发
- onText
- 客户端发送文本消息触发
StudyWebsocketExampleApplication
说明
这个类的名称不重要,它其实是你的 spring boot 启动类,只要记得加上**@EnableTioWebSocketServer**注解就可以了
STOMP
pom.xml
WebSocketConfig
说明
- 通过实现 WebSocketMessageBrokerConfigurer 接口和加上**@EnableWebSocketMessageBroker**来进行 stomp 的配置与注解扫描。
- 其中覆盖 registerStompEndpoints 方法来设置暴露的 stomp 的路径,其它一些跨域、客户端之类的设置。
- 覆盖 **configureMessageBroker **方法来进行节点的配置。
- 其中 **enableSimpleBroker **配置的广播节点,也就是服务端发送消息,客户端订阅就能接收消息的节点。
- 覆盖**setApplicationDestinationPrefixes **方法,设置客户端向服务端发送消息的节点。
- 覆盖 setUserDestinationPrefix 方法,设置一对一通信的节点。