websocket心跳重连

175 阅读1分钟

心跳机制是每隔一段时间会向服务器发送一个数据包,告诉服务器自己还活着,同时客户端会确认服务器端是否还活着,如果还活着的话,就会回传一个数据包给客户端来确定服务器端也还活着,否则的话,有可能是网络断开连接了。需要重连。

let reconnectInterval = 3000;// 设置重连间隔时间
let maxRetries = 5;// 最大重试次数 
let retries = 0; // 当前重试次数
const heartbeatInterval = 30 * 1000;// 心跳间隔(比如30秒)
const heartbeatTimeout = 60 * 1000;// 心跳超时(比如60秒)
let heartbeatIntervalId, heartbeatTimeoutId;
function startWebSocket(){
        // 创建WebSocket连接
        const ws = new WebSocket('ws://your-websocket-server');
    
       // 连接打开时的回调
        ws.onopen = function(event) {
          console.log('WebSocket connected');
          // 开始心跳
          startHeartbeat();
        };

        // 连接关闭时的回调
        ws.onclose = function(event) {
          console.log('WebSocket disconnected');
          // 清除心跳定时器
          clearHeartbeat();
          //重连
          reconnect();
        };
        
        // 接收到服务器消息时的回调
        ws.onmessage = function(event) {
          // 如果收到服务器消息,重置心跳超时
          clearTimeout(heartbeatTimeoutId);
          heartbeatTimeoutId = setTimeout(function() {
            ws.close();
          }, heartbeatTimeout);
        };
        
        // 出现错误时的回调
        ws.onerror = function(error) {
          console.error('WebSocket error observed:', error);
        };
}
开始心跳
function startHeartbeat() {
  // 定时发送心跳消息
  heartbeatIntervalId = setInterval(function() {
    ws.send('Heartbeat'); // 你可以发送任何特殊的心跳消息
  }, heartbeatInterval);

  // 设置超时并关闭连接,如果在heartbeatTimeout时间内没有收到消息
  heartbeatTimeoutId = setTimeout(function() {
    ws.close();
  }, heartbeatTimeout);
}
清除心跳定时器
function clearHeartbeat() {
  clearInterval(heartbeatIntervalId);
  clearTimeout(heartbeatTimeoutId);
}
重连函数
function reconnect(){
    if (retries < maxRetries) {

        retries++;

        console.log(`Attempting reconnection ${retries}`);

        setTimeout(startWebSocket, reconnectInterval);

    } else {

        console.error('Maximum reconnection attempts reached');

        // 处理最大重连次数达到后的逻辑

    }

}