websocket心跳机制原理

257 阅读2分钟

CSDN学习

仅用于自学。

前端实现WebSocket心跳机制的方法主要是两种:

  1. 使用setInterval定时发送心跳包
  2. 在前端监听到WebSocketonClose()事件,重新创建WebSocket连接。

webSocket心跳包是WebSocket协议的保活机制,用于维持长连接。有效的心跳包可以防止长时间不通讯时,WebSocket自动断开连接。 前端实现WebSocket心跳机制的方式。 心跳包是指一定时间间隔内,WebSocket发送的空数据包。

  1. 客户端定时向服务器发送心跳数据包,以保持长连接。
  2. 服务器定时向客户端发送心跳数据包,以检测客户端连接是否正常。
  3. 双向发送心跳数据包。

WebSocket心跳机制原理

  1. 客户端建立WebSocket连接。
  2. 客户端向服务器发送心跳数据包,服务器接收并返回一个表示接收到心跳数据包的响应。
  3. 当服务器没有及时接收客户端发送的心跳数据包时,服务器会发送一个关闭连接的请求。
  4. 服务器定时向客户端发送心跳数据包,客户端接收并返回一个表示接收到心跳数据包的响应。
  5. 当客户端没有及时接收到服务器发送的心跳数据包时,客户端会重新加接WebSocket.

WebSocket心跳作用

  1. 保持WebSocket连接不被断开。
  2. 检测WebSocket连接状态,及时处理异常情况。
  3. 减少WebSocket连接及服务器资源的消耗。

服务器端(Node.js示例)

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {

ws.isAlive = true;

// 设置一个interval定时器,每隔10秒发送一次ping消息

const interval = setInterval(function ping() {

if (ws.isAlive === false) return ws.terminate();

ws.isAlive = false;

ws.ping(null, false, true);

}, 10000);

ws.on('pong', function () {

ws.isAlive = true;

});

// 当连接关闭时清除定时器

ws.on('close', function () {

clearInterval(interval);

});

});

客户端

const ws = new WebSocket('ws://localhost:8080');
 
ws.onopen = function open() {
  console.log('Connected');
  
  // 设置一个interval定时器,每隔10秒发送一次ping消息到服务器
  window.setInterval(function ping() {
    ws.send(JSON.stringify({ type: 'ping' }));
  }, 10000);
};
 
ws.onmessage = function message(event) {
  const data = JSON.parse(event.data);
  
  if (data.type === 'pong') {
    // 处理pong消息
    console.log('Received pong');
  }
};
 
ws.onclose = function close() {
  console.log('Disconnected');
};
 
ws.onerror = function error() {
  console.log('Error');
};