websocket心跳检测和重连机制(复制即用)

本文介绍了如何使用WebSocket进行实时通信,包括创建WebSocket连接、心跳检测机制、以及遇到问题时的自动重连策略。通过实例展示了如何处理接收到的数据、ping/pong心跳检查以及在断线后进行重连的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

data() {
  return {
    wsurl: 'ws://127.0.0.1:8080',
    websock: null,
    lockReconnect: false,
    timerReconnect: null,
    heartTimeout: null,
    serverTimeout: null
  };
},
created() {
  this.createWebSocket();
},
beforeDestroy() {
  if (this.websock) this.websock.close();
},
// 创建websocket
createWebSocket() {
  try {
    this.websock = new WebSocket(this.wsurl);
    this.initWebSocket();
  } catch (e) {
    console.log('catch', e);
    this.reconnect();
  }
},
initWebSocket() {
  this.websock.onmessage = (e) => {
    console.log('数据接收', e);
    // 拿到pong说明当前连接是正常的
    if (e.data === 'pong') {
      this.heartCheck();
    }
  };
  this.websock.onopen = () => {
    console.log('连接成功', this.websock);
    this.heartCheck();
  };
  this.websock.onerror = () => {
    console.log('连接失败');
    this.reconnect();
  };
  this.websock.onclose = (e) => {
    console.log('断开连接', e);
    this.reconnect();
  };
},
// 重连
reconnect() {
  if (this.lockReconnect) {
    return;
  }
  console.log('发起重连');
  this.lockReconnect = true;
  // 没连接上会一直重连,设置延迟
  this.timerReconnect && clearTimeout(this.timerReconnect);
  this.timerReconnect = setTimeout(() => {
    this.createWebSocket();
    this.lockReconnect = false;
  }, 3 * 1000);
},
// 心跳检测
heartCheck() {
  this.heartTimeout && clearTimeout(this.heartTimeout);
  this.serverTimeout && clearTimeout(this.serverTimeout);
  this.heartTimeout = setTimeout(() => {
    // 发送一个心跳包
    console.log('发送ping');
    this.websock.send('ping');
    // 计算答复的超时时间
    this.serverTimeout = setTimeout(() => {
      this.websock.close();
      console.log('答复超时');
    }, 5 * 1000);
  }, 4 * 1000);
}
<think>好的,我现在需要帮助用户了解如何使用Spring BootVue实现WebSocket通信。用户之前已经询问过WebSocketSSE的区别,现在可能正在开发一个需要实时双向通信的项目,比如聊天应用或者实时数据监控。 首先,我要确定用户的技术背景。他们可能已经熟悉Spring BootVue的基础,但需要具体的实现步骤。因此,我需要分步骤讲解,从后端到前端,确保每个部分都清晰易懂。 接下来,考虑Spring Boot的WebSocket配置。需要引入依赖,比如spring-boot-starter-websocket。然后配置WebSocket处理器拦截器,这部分可能需要示例代码,让用户能够直接复制并修改。同时,要提到消息对象控制器,确保后端能够处理连接、消息发送关闭事件。 然后是Vue前端部分。用户可能需要使用原生WebSocket API或者第三方库,比如vue-native-websocket。需要比较两者的优缺点,帮助用户选择适合的方案。示例代码应该包括连接、发送消息接收消息的逻辑,特别是如何在Vue组件中集成这些功能。 还要考虑常见问题,比如跨域心跳机制。用户可能在开发过程中遇到这些问题,提前给出解决方案能节省他们的时间。此外,测试步骤也很要,确保他们能够验证实现是否正确。 最后,是否需要扩展建议?比如结合STOMP或者分布式方案,这取决于用户的进阶需求。但用户当前可能只需要基础实现,所以放在扩展部分,供他们参考。 总结一下,结构应该是先讲后端配置,再讲前端实现,接着是常见问题处理,最后测试扩展建议。这样用户能够逐步跟随,完成整个WebSocket通信的搭建。</think>以下是使用Spring BootVue实现WebSocket通信的完整指南,包含代码示例关键配置: --- ### 一、Spring Boot后端实现(基于原生WebSocket) #### 1. 添加依赖 ```xml <!-- pom.xml --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` #### 2. WebSocket配置类 ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/ws") .setAllowedOrigins("*") // 允许跨域 .addInterceptors(new HttpSessionHandshakeInterceptor()); } @Bean public WebSocketHandler myHandler() { return new MyWebSocketHandler(); } } ``` #### 3. 消息处理器 ```java public class MyWebSocketHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) { sessions.add(session); System.out.println("连接建立: " + session.getId()); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) { String payload = message.getPayload(); System.out.println("收到消息: " + payload); // 广播消息给所有客户端 sessions.forEach(s -> { try { s.sendMessage(new TextMessage("服务器响应: " + payload)); } catch (IOException e) { e.printStackTrace(); } }); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { sessions.remove(session); System.out.println("连接关闭: " + session.getId()); } } ``` --- ### 二、Vue前端实现(两种方式) #### 方案1:原生WebSocket API ```vue <template> <div> <input v-model="message" /> <button @click="send">发送</button> <div v-for="(msg, index) in messages" :key="index">{{ msg }}</div> </div> </template> <script> export default { data() { return { message: '', messages: [], socket: null } }, mounted() { this.initWebSocket(); }, methods: { initWebSocket() { this.socket = new WebSocket('ws://localhost:8080/ws'); this.socket.onopen = () => { console.log('连接已建立'); }; this.socket.onmessage = (event) => { this.messages.push(event.data); }; this.socket.onclose = () => { console.log('连接已关闭'); }; }, send() { if (this.socket.readyState === WebSocket.OPEN) { this.socket.send(this.message); this.message = ''; } } }, beforeDestroy() { this.socket.close(); } } </script> ``` #### 方案2:使用vue-native-websocket(推荐) ```bash npm install vue-native-websocket ``` ```js // main.js import VueNativeSock from 'vue-native-websocket' Vue.use(VueNativeSock, 'ws://localhost:8080/ws', { reconnection: true, // 自动连 format: 'json' // 自动JSON序列化 }); ``` ```vue <template> <div> <input v-model="message" /> <button @click="send">发送</button> </div> </template> <script> export default { data() { return { message: '' } }, sockets: { connect() { console.log('Socket connected'); }, message(data) { console.log('收到消息:', data); } }, methods: { send() { this.$socket.send(this.message); this.message = ''; } } } </script> ``` --- ### 三、关键配置注意事项 1. **跨域问题** ```java // Spring Boot配置类添加 .setAllowedOrigins("*") // 生产环境应指定具体域名 ``` 2. **心跳机制** ```js // Vue端添加心跳检测 setInterval(() => { if (this.socket) this.socket.send('ping'); }, 30000); ``` 3. **消息协议** ```java // 后端处理JSON消息 @Component public class Message { private String content; // getters/setters } ``` --- ### 四、测试验证步骤 1. 启动Spring Boot应用 2. 运行Vue项目(`npm run serve`) 3. 打开两个浏览器窗口模拟多用户 4. 测试消息发送广播功能 --- ### 五、扩展方案(进阶需求) 1. **使用STOMP协议** ```java // Spring Boot配置 @Configuration @EnableWebSocketMessageBroker public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws-stomp").withSockJS(); } } ``` 2. **分布式场景** - 使用Redis Pub/Sub进行消息广播 - 结合Spring Boot的`@SendTo`注解 --- ### 六、常见问题解决方案 | 问题现象 | 解决方法 | |-------------------------|---------------------------------| | 前端连接失败(404) | 检查后端端点路径是否匹配,确保已添加跨域配置 | | 消息发送后无响应 | 使用Chrome开发者工具查看WebSocket帧传输 | | 断开后无法自动连 | 使用`vue-native-websocket`的机制 | | 高并发时连接不稳定 | 调整服务器线程池配置,增加心跳检测间隔 | 实际部署时建议配合Nginx进行WebSocket代理: ```nginx location /ws { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值