当前位置:   article > 正文

SpringBoot整合Websocket的使用_spring boot websocket 客户端

spring boot websocket 客户端

一、什么是WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它允许客户端和服务器之间的双向通信,使得实时数据传输成为可能。相比传统的 HTTP 请求-响应模型,WebSocket 具有更低的延迟,更高的性能和更少的网络开销。

WebSocket 协议的特点包括:

  1. 全双工通信:WebSocket 允许客户端和服务器之间同时进行双向通信,而不是像 HTTP 那样只能由客户端发起请求,服务器才能响应。

  2. 低延迟:由于 WebSocket 建立在单个 TCP 连接上,因此可以减少因为建立和销毁连接而引起的网络开销,从而实现更低的延迟。

  3. 轻量级:WebSocket 的协议头较小,相比于一些其他协议(如 HTTP),它在通信时的网络开销较少。

  4. 实时性:WebSocket 适用于需要实时更新的应用程序,如在线游戏、股票交易、即时聊天等,因为它能够提供持续的连接并立即传输数据。

  5. 跨平台性:WebSocket 协议是跨平台的,可以在各种操作系统和设备上使用,包括桌面浏览器、移动设备和服务器端应用程序。

WebSocket 协议通过在 HTTP 协议的升级过程中建立连接,实现了与 Web 服务器的通信。一旦建立了 WebSocket 连接,客户端和服务器之间就可以直接通过发送消息进行实时通信,而不需要每次通信都建立新的连接。这种持久连接的特性使得 WebSocket 成为实现实时 Web 应用程序的重要技术之一。

二、Websocket适用场景

WebSocket 在以下几种场景中特别适用:

  1. 实时通信应用程序:WebSocket 最常见的用途之一是实时通信应用程序,如聊天应用程序、在线游戏、实时数据更新等。通过 WebSocket,客户端和服务器可以建立持久连接,实时地交换消息,实现实时性要求较高的应用场景。

  2. 在线协作工具:在线协作工具(如实时文档编辑、白板共享等)需要多个用户之间的实时同步和通信。WebSocket 可以用于实现用户之间的实时协作,使得多个用户能够实时地查看和编辑共享的内容。

  3. 实时数据监控和展示:对于需要实时监控和展示数据的应用场景,WebSocket 可以用于从服务器实时获取数据并在客户端展示,如实时股票报价、实时天气预报、实时交通信息等。

  4. 在线客服系统:在线客服系统需要实现客户和客服之间的实时交流和沟通。通过 WebSocket,客户可以实时向客服发送消息,客服也可以实时地回复客户,提供更加及时的服务。

  5. 实时事件通知:对于需要向用户发送实时事件通知的应用场景,如新闻推送、社交网络通知等,WebSocket 可以用于向客户端推送实时事件通知,使得用户能够及时地收到重要信息。

总的来说,WebSocket 适用于需要实现实时性通信和交互的应用场景,能够提供更加流畅和即时的用户体验。

三、使用SpringBoot整合Websocket

   1、添加依赖:首先,在 pom.xml  中添加 Spring WebSocket 的依赖。对于 Maven 项目,可以添加以下依赖:

        

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

2、创建一个配置类,用于配置 WebSocket 的端点和处理器。

  1. /**
  2. * WebSocket配置类
  3. */
  4. @Configuration
  5. @EnableWebSocket
  6. public class WebSocketConfig {
  7. @Bean
  8. public ServerEndpointExporter serverEndpointExporter() {
  9. return new ServerEndpointExporter();
  10. }
  11. }

3、编写 WebSocket 处理器:创建一个类来处理 WebSocket 连接和消息。

  1. import com.yupi.springbootinit.model.entity.WebSocketMessage;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.stereotype.Component;
  4. import javax.websocket.*;
  5. import javax.websocket.server.ServerEndpoint;
  6. import java.util.concurrent.ConcurrentHashMap;
  7. /**
  8. *
  9. * @author caicai
  10. * @date
  11. * @ServerEndpoint
  12. */
  13. @Component
  14. @Slf4j
  15. @ServerEndpoint(value = "/websocket")
  16. public class WebSocketServer {
  17. /**
  18. * 某个客户端连接的session
  19. */
  20. private Session session;
  21. private static ConcurrentHashMap<String,Session> clientMap = new ConcurrentHashMap<>();
  22. /**
  23. * 建立连接后调用的方法
  24. * @param session
  25. */
  26. @OnOpen
  27. public void onOpen(Session session){
  28. log.info("-----websocket成功连接------");
  29. this.session = session;
  30. clientMap.put(this.session.getId(),this.session);
  31. }
  32. /**
  33. * 处理客户端失败连接
  34. */
  35. @OnClose
  36. public void onClose(){
  37. clientMap.remove(this.session.getId());
  38. log.info("客户端失去连接,其sessionID为:"+this.session.getId());
  39. }
  40. /**
  41. * 连接报错时的处理方式
  42. * @param session
  43. * @param error
  44. */
  45. @OnError
  46. public void onError(Session session, Throwable error) {
  47. log.error("消息发生错误:"+session.getId());
  48. error.printStackTrace();
  49. }
  50. /**
  51. * 如果需要服务器接受客户端的消息就在这里写了
  52. * @param text
  53. */
  54. @OnMessage
  55. public void onMessage(String text){
  56. log.info("接受到客户端传来的消息:"+text);
  57. }
  58. /**
  59. * 推送消息
  60. * getAsyncRemote获取异步端点(推荐使用这个)
  61. * getBasicRemote获取阻塞端点(不推荐,如果第一次发送失败,就会一直阻塞,影响后面的进行)
  62. * @param message
  63. */
  64. public static void sendMessage(WebSocketMessage message){
  65. // 遍历向所有用户发送消息
  66. clientMap.entrySet().stream().forEach(item ->{
  67. item.getValue().getAsyncRemote().sendText(message.getMessageContent());
  68. });
  69. }
  70. /**
  71. * 将消息发送给特定的用户
  72. */
  73. public static void sendToSpecClient(String clientId,WebSocketMessage webSocketMessage){
  74. if(clientMap.contains(clientId)){
  75. clientMap.get(clientId).getAsyncRemote().sendText(webSocketMessage.getMessageContent());
  76. }else{
  77. clientMap.remove(clientId);
  78. // throw new RuntimeException("特定用户消息发生错误,请稍后重试");
  79. }
  80. }

后端简单整合就此完成

Websocket在线模拟请求工具:支持内网和外网Websocket测试

地址:Websocket在线测试-Websocket接口测试-Websocket模拟请求工具

查看后台输出

四、整合js测试

下面是一个简单的示例,演示了如何在前端页面中使用 JavaScript 整合 WebSocket:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>WebSocket Demo</title>
  7. </head>
  8. <body>
  9. <h1>WebSocket Demo</h1>
  10. <input type="text" id="message" placeholder="Enter message">
  11. <button onclick="sendMessage()">Send</button>
  12. <div id="messages"></div>
  13. <script>
  14. // 创建 WebSocket 连接
  15. var socket = new WebSocket("ws://localhost:123456/websocket");
  16. // 监听连接建立事件
  17. socket.onopen = function(event) {
  18. console.log("WebSocket连接已建立");
  19. };
  20. // 监听收到消息事件
  21. socket.onmessage = function(event) {
  22. console.log("收到消息:" + event.data);
  23. var messagesDiv = document.getElementById("messages");
  24. messagesDiv.innerHTML += "<p>" + event.data + "</p>";
  25. };
  26. // 监听连接关闭事件
  27. socket.onclose = function(event) {
  28. console.log("WebSocket连接已关闭");
  29. };
  30. // 发送消息函数
  31. function sendMessage() {
  32. var message = document.getElementById("message").value;
  33. socket.send(message);
  34. }
  35. </script>
  36. </body>
  37. </html>

 

在这个示例中,首先通过 new WebSocket("ws://localhost:123456/websocket") 创建了一个 WebSocket 连接,连接到了 ws://localhost:123456/websocket 这个端点。然后,通过监听连接建立、收到消息和连接关闭等事件,分别执行相应的操作。最后,通过 socket.send(message) 函数发送消息。

在实际项目中,你可以根据具体需求进一步扩展 WebSocket 的功能,例如处理连接错误、重连机制、消息处理、心跳机制等。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号