• 消息服务应用1——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. org.springframework.boot
    2. spring-boot-starter-websocket
    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 WEB_SOCKET_SET = new CopyOnWriteArraySet<>();
    12. /**
    13. * 存储新链接标识。
    14. */
    15. public static Map 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/该网址自主连接测试

  • 相关阅读:
    forward 函数在深度神经网络程序中确实用于表示程序逻辑,特别是网络的前向传播过程。它描述了输入数据如何通过网络的每一层,并最终得到输出预测值的流程
    大部分PHP程序员,都搞不懂如何安全代码部署【二】(nginx篇)
    股票交易数据接口获取股票基础信息数据的过程
    转转前端周刊第八十一期
    go工具类的封装——(一)配置文件工具类封装
    Python安装json模块(simplejson)
    【HDOJ2586】【Tarjan离线求LCA】
    uniapp前端样式
    Linxu系统(Centos 7)安装 DNS 服务
    数字孪生助力智慧城市、楼宇、园区场景数字化系统建设
  • 原文地址:https://blog.csdn.net/w10463672p/article/details/138159018