找回密码
 立即注册
首页 资源区 代码 WebSocket

WebSocket

祺簇 2025-10-26 02:20:05
maven坐标
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     spring-boot-starter-websocket</artifactId>
  4. </dependency>
复制代码
简单的前后端WebSocket连接示例

WebSocket 连接完整流程

连接建立阶段

前端初始化:
后端接收连接:
  1. @OnOpen
  2. public void onOpen(Session session, @PathParam("sid") String sid) {
  3.     System.out.println("客户端:" + sid + "建立连接");
  4.     sessionMap.put(sid, session);
  5. }
复制代码
连接确认:
消息交互阶段

前端发送消息:
  1. function send(){
  2.     var message = document.getElementById('text').value;
  3.     websocket.send(message);
  4. }
复制代码
后端接收处理消息:
  1. @OnMessage
  2. public void onMessage(String message, @PathParam("sid") String sid) {
  3.     System.out.println("收到来自客户端:" + sid + "的信息:" + message);
  4. }
复制代码
后端主动推送消息:
  1. public void sendToAllClient(String message) {
  2.     Collection<Session> sessions = sessionMap.values();
  3.     for (Session session : sessions) {
  4.         try {
  5.             //服务器向客户端发送消息
  6.             session.getBasicRemote().sendText(message);
  7.         } catch (Exception e) {
  8.             e.printStackTrace();
  9.         }
  10.     }
  11. }
复制代码
前端接收消息:
  1. websocket.onmessage = function(event){
  2.     setMessageInnerHTML(event.data);
  3. }
  4. function setMessageInnerHTML(innerHTML){
  5.     document.getElementById('message').innerHTML += innerHTML + '<br/>';
  6. }
复制代码
连接关闭阶段


  • 主动关闭:

    • 用户点击 "关闭连接" 按钮,触发 closeWebSocket() 函数
    • 调用 websocket.close() 方法关闭连接


  1. function closeWebSocket() {
  2.     websocket.close();
  3. }
复制代码

  • 页面关闭时关闭连接:

    • 监听 window.onbeforeunload 事件,在页面关闭前主动关闭 WebSocket 连接
    • 防止连接未断开就关闭页面导致服务器抛出异常


  1. window.onbeforeunload = function(){
  2.     websocket.close();
  3. }
复制代码
后端处理关闭:
  1. @OnClose
  2. public void onClose(@PathParam("sid") String sid) {
  3.     System.out.println("连接断开:" + sid);
  4.     sessionMap.remove(sid);
  5. }
复制代码
前端关闭回调
简单的代码实现

注册WebSocket的ServerEndpointExporter
  1. @Configuration
  2. public class WebSocketConfiguration {
  3.     /**
  4.      * 注册WebSocket的ServerEndpointExporter
  5.      * 扫描带有@ServerEndpoint注解的类,并注册成websocket服务
  6.      *
  7.      * ServerEndpointExporter是Spring框架提供的一个用于支持WebSocket的核心组件,它的主要作用是:
  8.      * 扫描并注册WebSocket端点:自动检测Spring容器中带有@ServerEndpoint注解的类,并将它们注册为WebSocket端点
  9.      * 创建和管理WebSocket实例:负责为每个WebSocket连接创建对应的端点实例
  10.      * 连接生命周期管理:处理WebSocket连接的建立、消息传输和关闭等生命周期事件
  11.      *
  12.      * @return
  13.      */
  14.     @Bean
  15.     public ServerEndpointExporter serverEndpointExporter() {
  16.         return new ServerEndpointExporter();
  17.     }
  18. }
复制代码
定义WebSocket服务端组件
  1. @Component
  2. @ServerEndpoint("/ws/{sid}")
  3. public class WebSocketServer {
  4.     //存放会话对象
  5.     private static Map<String, Session> sessionMap = new HashMap();
  6.     /**
  7.      * 连接建立成功调用的方法
  8.      */
  9.     @OnOpen
  10.     public void onOpen(Session session, @PathParam("sid") String sid) {
  11.         System.out.println("客户端:" + sid + "建立连接");
  12.         sessionMap.put(sid, session);
  13.     }
  14.     /**
  15.      * 收到客户端消息后调用的方法
  16.      *
  17.      * @param message 客户端发送过来的消息
  18.      */
  19.     @OnMessage
  20.     public void onMessage(String message, @PathParam("sid") String sid) {
  21.         System.out.println("收到来自客户端:" + sid + "的信息:" + message);
  22.     }
  23.     /**
  24.      * 连接关闭调用的方法
  25.      *
  26.      * @param sid
  27.      */
  28.     @OnClose
  29.     public void onClose(@PathParam("sid") String sid) {
  30.         System.out.println("连接断开:" + sid);
  31.         sessionMap.remove(sid);
  32.     }
  33.     /**
  34.      * 群发
  35.      *
  36.      * @param message
  37.      */
  38.     public void sendToAllClient(String message) {
  39.         Collection<Session> sessions = sessionMap.values();
  40.         for (Session session : sessions) {
  41.             try {
  42.                 //服务器向客户端发送消息
  43.                 session.getBasicRemote().sendText(message);
  44.             } catch (Exception e) {
  45.                 e.printStackTrace();
  46.             }
  47.         }
  48.     }
  49. }
复制代码
简单的前端
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>WebSocket Demo</title>
  6. </head>
  7. <body>
  8. <input id="text" type="text" />
  9. <button onclick="send()">发送消息</button>
  10. <button onclick="closeWebSocket()">关闭连接</button>
  11. </body>
  12. </html>
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2025-11-8 17:47:12

举报

您需要登录后才可以回帖 登录 | 立即注册