当前位置:   article > 正文

消息服务应用1——java项目简单实现websocket并配置前端链接访问_java后端给websocket方法加锁

java后端给websocket方法加锁

在当前微服务项目中,由于业务模块众多,消息服务的使用场景变得异常活跃。而WebSocket由于其自身的可靠性强,实时性好,带宽占用更小的优势,在实时通讯应用场景中独占鳌头,加上HTML5标准的普及流行,在前端和后端开发中应用异常广泛。

一.关于WebSocket

1.WebSocket是什么?

WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。简单来说,它就是html5中的一种新的协议,其实质就是对html的长连接的一种升级。

2.与HTTP比较
  • HTTP是短连接,WebSocket是长连接;
  • HTTP通信是单向的,基于请求响应模式,WebSocket支持双向通信;
  • HTTP和WebSocket底层都是TCP连接。
3.WebSocket优点
  • websocket连接只需要建立一次,在第一次连接的时候,客户端和服务器会交换必要的信息。
  • websocket是双向通信的,对比ajax请求还是长轮询,他们都是通过客户端发送请求,服务器响应的形式完成信息的交换,这种模式下服务器处于一种被动的角色。而websocket不存在这个问题,websocket的链接一旦建立,服务器和客户端都可以互推信息。

二. WebSocket使用

文案基于jdk1.8+maven3.8.1+springboot2.7.13而编写

1.引入websocket.jar包
  1. <!-- websocket模块-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-websocket</artifactId>
  5. </dependency>
2.配置WebSocket
  1. @Configuration
  2. public class MyWebSocketConfig {
  3. @Bean
  4. public ServerEndpointExporter serverEndpointExporter() {
  5. return new ServerEndpointExporter();
  6. }
  7. }
3.WebSocket连接,发送和接收信息
  1. @ServerEndpoint("/websocket/test")
  2. @Component
  3. public class TestWebSocketInfo {
  4. /**
  5. * 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  6. */
  7. private static int ONLINE_COUNT = 0;
  8. /**
  9. * concurrent包的线程安全Set,用来存放每个客户端对应的BigScreenWebSocket对象。
  10. */
  11. private static CopyOnWriteArraySet<TestWebSocketInfo> WEB_SOCKET_SET = new CopyOnWriteArraySet<>();
  12. /**
  13. * 存储新链接标识。
  14. */
  15. public static Map<String, Object> USER_SESSIONS = new HashMap<>(0);
  16. /**
  17. * 与某个客户端的连接会话,需要通过它来给客户端发送数据。
  18. */
  19. private Session session;
  20. /**
  21. * 连接建立成功调用的方法
  22. */
  23. @OnOpen
  24. public void onOpen(Session session) throws Exception {
  25. this.session = session;
  26. // 生成唯一ID
  27. String uuid = String.valueOf(UUID.randomUUID());
  28. // 把唯一标识跟客户端绑定
  29. USER_SESSIONS.put(uuid, this.session);
  30. // 加入set中
  31. WEB_SOCKET_SET.add(this);
  32. synchronized (this) {
  33. // 使用加锁的方式保证请求串行计数
  34. TestWebSocketInfo.ONLINE_COUNT++;
  35. }
  36. //需要发送到业务数据
  37. onMessage(JSONObject.toJSONString("Hello,Websocket"));
  38. System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
  39. }
  40. /**
  41. * 连接关闭调用的方法
  42. */
  43. @OnClose
  44. public void onClose() {
  45. // 从set中删除
  46. WEB_SOCKET_SET.remove(this);
  47. boolean removeFlag = WEB_SOCKET_SET.remove(this);
  48. // 使用加锁的方式保证请求串行计数
  49. if (removeFlag && BigScreenWebSocketInfo.ONLINE_COUNT > 0) {
  50. TestWebSocketInfo.ONLINE_COUNT--;
  51. }
  52. System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
  53. }
  54. /**
  55. * 收到客户端消息后调用的方法
  56. *
  57. * @param message 客户端发送过来的消息
  58. */
  59. @OnMessage
  60. public void onMessage(String message) {
  61. sendMessage(message);
  62. }
  63. /**
  64. * 发生错误时调用
  65. *
  66. * @param session
  67. * @param error
  68. */
  69. @OnError
  70. public void onError(Session session, Throwable error) {
  71. // 从set中删除
  72. USER_SESSIONS.remove(session);
  73. // 从set中删除
  74. boolean removeFlag = WEB_SOCKET_SET.remove(this);
  75. USER_SESSIONS.remove(session);
  76. // 使用加锁的方式保证请求串行计数
  77. if (removeFlag && BigScreenWebSocketInfo.ONLINE_COUNT > 0) {
  78. TestWebSocketInfo.ONLINE_COUNT--;
  79. }
  80. System.out.println("发生错误");
  81. error.printStackTrace();
  82. }
  83. public void sendMessage(String message) {
  84. try {
  85. for (TestWebSocketInfo item : WEB_SOCKET_SET) {
  86. // 判断链接是否关闭
  87. if (item.session.isOpen()) {
  88. synchronized (item.session) {
  89. item.session.getBasicRemote().sendText(message);
  90. }
  91. }
  92. }
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. }
  96. }
  97. public static synchronized int getOnlineCount() {
  98. return ONLINE_COUNT;
  99. }
  100. }
4.功能测试

当服务端开发完成之后,可以使用https://wstool.js.org/该网址自主连接测试

三.web前段项目如何设置访问websocket

具体操作请参考如下:

nginx配置websocket访问

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

闽ICP备14008679号