最近项目中需要使用WebSocket实现实时传递消息功能,网上大多数都是 Socket 实现,而 使用Spring 的WebSocket 的也有不少,但是大多数都只写了一种方法:@ServerEndpoint() 这个方法 ,其实还有另一种方法 WebSocketConfigurer 。这里将会把两种方法介绍下。
@ServerEndpoint() 方法
服务端配置
- WebSocket 配置类
1 | java复制代码@Configuration |
- 服务端类
1 | java复制代码@Component |
客户端
1 | java复制代码public class WebSocketClient extends Endpoint { |
连接方法
1 | java复制代码 WebSocketContainer container = ContainerProvider.getWebSocketContainer(); |
- 要想忽略ssl认证,则需要添加SSLContext
1 | java复制代码 SSLContext sslContext = SSLContext.getInstance("SSL"); |
x509ExtendedTrustManager 必须是
javax.net.ssl.X509ExtendedTrustManager
下的包。
连接后Log 信息
1 | yaml复制代码2021-10-30 11:17:44.515 INFO 15808 --- [nio-8181-exec-1] c.e.websocket.spring1.WebSocketClient : -----client open |
WebSocketConfigurer 方法
服务端配置
- AbstractWebSocketHandler 实现,主要是接收消息
1 | java复制代码@Component |
- HandshakeInterceptor 实现,主要作用是对请求的拦截
1 | java复制代码@Component |
- WebSocket 配置,主要是配置跨域、请求路径等
1 | java复制代码@EnableWebSocket |
客户端
- AbstractWebSocketHandler实现,主要作用是接收数据,连接监听等。
1 | java复制代码@Component |
连接方法
1 | java复制代码 StandardWebSocketClient standardWebSocketClient = new StandardWebSocketClient(); |
连接后Log信息
1 | java复制代码2021-10-30 11:12:20.997 INFO 15779 --- [nio-8181-exec-1] o.s.w.s.c.WebSocketConnectionManager : Starting WebSocketConnectionManager |
总结
@ServerEndpoint()
这种方式的,操作简单,方法封装的很好,但是不能拦截 WebSocket 的请求,也就不能活去header 值,加入需要校验,那么就会不知所措。
WebSocketConfigurer
这种方法,操作起来稍微复杂一些,但是可以自己设置拦截器,拦截请求,能获取到请求中的所有的内容。
他们都各有利弊,根据自己项目的实际情况来选择使用哪种方式。
最后demo地址:github.com/wdmxzf/java…
本文转载自: 掘金