当前位置:   article > 正文

Springboot 整合 WebSocket_springboot整合websocket

springboot整合websocket

一、什么是 WebSocket

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,即允许服务器主动发送信息给客户端。因此,在WebSocket中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输,客户端和服务器之间的数据交换变得更加简单。

全双工(Full Duplex)是通讯传输的一个术语。通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。

单工就是在只允许甲方向乙方传送信息,而乙方不能向甲方传送 。(比喻汽车的单行道。)

(查看更多:全双工——百度百科

【注】所谓的“浏览器和服务器只需要完成一次握手”,是说在三次握手完成TCP连接后,还会传输一次握手数据;

二、WebSocket的特点

WebSocket既然是全双工通信,自然是能实现聊天软件、订阅、游戏等;其特点是:

  • 建立在 TCP 协议之上,处于OSI模型中的应用层,服务器端的实现比较容易。
  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  • 数据格式比较轻量,性能开销小,通信高效。
  • 可以发送文本,也可以发送二进制数据。
  • 没有同源限制,客户端可以与任意服务器通信。
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

三、Springboot 整合 WebSocket

1、pom.xml 引入依赖包

  1. <!--websocket-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-websocket</artifactId>
  5. </dependency>

2、暴露 WebSocket 接口

  1. @Slf4j
  2. @Component
  3. @ServerEndpoint(value = "/playBack")
  4. public class WebSocketServerPlayBack {
  5. /** 记录链接在线数量 **/
  6. private static final AtomicInteger onlineCount = new AtomicInteger(0);
  7. /** 存放每个客户端对应的 WebSocketServer 对象 **/
  8. private static CopyOnWriteArraySet<WebSocketServerPlayBack> webSocketSet = new CopyOnWriteArraySet<>();
  9. /** 与某个客户端的连接会话,需要通过它来给客户端发送数据 **/
  10. private Session session;
  11. /** 心跳报文 **/
  12. private static final String HEARTBEAT_PACKETS = "The heartbeat packets";
  13. /**
  14. * 连接建立成功调用的方法
  15. */
  16. @OnOpen
  17. public void onOpen(Session session) {
  18. this.session = session;
  19. // 加入set中
  20. webSocketSet.add(this);
  21. // 在线数加1
  22. onlineCount.getAndIncrement();
  23. }
  24. /**
  25. * 连接关闭调用的方法
  26. */
  27. @OnClose
  28. public void onClose() {
  29. // 从set中删除
  30. webSocketSet.remove(this);
  31. // 在线数减1
  32. onlineCount.getAndDecrement();
  33. }
  34. /**
  35. * 发生错误时调用
  36. */
  37. @OnError
  38. public void onError(Session session, Throwable error) {
  39. log.error("[历史数据回放] - WS 异常断开", session, error);
  40. }
  41. /**
  42. * 收到客户端消息后调用的方法
  43. *
  44. * @param message 客户端发送过来的消息*/
  45. @OnMessage
  46. public void onMessage(String message, Session session) {
  47. if (HEARTBEAT_PACKETS.equals(message)) {
  48. log.debug("[消息订阅] - 心跳.");
  49. return;
  50. }
  51. // TODO 接收前端入参后的业务处理
  52. }
  53. /**
  54. * 群发自定义消息
  55. */
  56. public static void sendInfo(String message) {
  57. for (WebSocketServerPlayBack item : webSocketSet) {
  58. try {
  59. item.sendMessage(message);
  60. } catch (IOException e) {
  61. log.error("[NVR 数据对接] - 数据推送异常, 数据: [{}].", message, e);
  62. continue;
  63. }
  64. }
  65. }
  66. /**
  67. * 指定会话推送
  68. * @param message
  69. */
  70. public static void sendInfo(Session session, String message) {
  71. for (WebSocketServerPlayBack item : webSocketSet) {
  72. try {
  73. if (null != session && item.session.equals(session)) {
  74. item.sendMessage(message);
  75. }
  76. } catch (IOException e) {
  77. log.error("[数据对接] - 数据推送异常, 数据: [{}].", message, e);
  78. continue;
  79. }
  80. }
  81. }
  82. /**
  83. * 向链接推送消息
  84. * @param message
  85. * @throws IOException
  86. */
  87. public void sendMessage(String message) throws IOException {
  88. this.session.getBasicRemote().sendText(message);
  89. }
  90. }

3、灵活配置 WebSocket ,避免报文太大,接收时报错

  1. @Configuration
  2. public class WebSocketConfig {
  3. /**
  4. * 自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
  5. *
  6. * @return
  7. */
  8. @Bean
  9. public ServerEndpointExporter serverEndpointExporter() {
  10. return new ServerEndpointExporter();
  11. }
  12. /**
  13. * 通信文本消息和二进制缓存区大小
  14. * 避免对接 第三方 报文过大时,Websocket 1009 错误
  15. * @return
  16. */
  17. @Bean
  18. public ServletServerContainerFactoryBean createWebSocketContainer() {
  19. ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
  20. // 在此处设置bufferSize
  21. container.setMaxTextMessageBufferSize(10240000);
  22. container.setMaxBinaryMessageBufferSize(10240000);
  23. container.setMaxSessionIdleTimeout(15 * 60000L);
  24. return container;
  25. }
  26. }

4、调用接口调试

ws://216.1.1.7:2713/playBack

测试 webSocket 收发小工具:websocket.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/892614
推荐阅读
相关标签
  

闽ICP备14008679号