千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > WebSocket心跳的实现

WebSocket心跳的实现

来源:千锋教育
发布人:xqq
时间: 2023-11-23 12:21:14 1700713274

一、什么是WebSocket心跳

WebSocket心跳是指通过在客户端和服务端之间以固定时间间隔发送心跳消息,以确保连接持续有效的机制。在WebSocket连接中,由于TCP连接的特性,当数据传输完成后连接并不会马上关闭,因此使用心跳可以保证连接在空闲状态时也不被关闭。

通常情况下,心跳发送的间隔需要根据实际场景进行设计,一般在几秒钟到几分钟之间,以达到较好的效果。同时,心跳内容也需要特殊处理,以便客户端和服务端在接收心跳消息时可以通过特殊标志判断是否为心跳消息,并及时回复确认消息。

二、如何在JavaScript中实现WebSocket心跳

在JavaScript中,可以通过setInterval函数设置定时器,周期性地向服务端发送心跳消息。在接收到服务端的响应后,以及在WebSocket关闭或发生错误时,需要清理定时器,停止心跳消息的发送。


let heartbeatTimer = null;

function startHeartbeat(ws) {
  // 每5秒向服务端发送一次心跳消息
  heartbeatTimer = setInterval(function () {
    let msg = { type: "heartbeat" };
    ws.send(JSON.stringify(msg));
  }, 5000);
}

function stopHeartbeat() {
  clearInterval(heartbeatTimer);
}

三、如何在服务端实现WebSocket心跳

在服务端通常使用定时器周期性地向所有连接发送心跳消息。在接收到客户端的心跳消息后,服务端需要及时回复确认消息,以表示连接仍然有效。


let heartbeatTimer = null;

function startHeartbeat(ws) {
  // 每10秒发送一次心跳消息
  heartbeatTimer = setInterval(function () {
    let msg = { type: "heartbeat" };
    ws.send(JSON.stringify(msg));
  }, 10000);
}

function stopHeartbeat() {
  clearInterval(heartbeatTimer);
}

// WebSocket连接监听
wss.on('connection', function (ws) {
  // 启动心跳机制
  startHeartbeat(ws);

  // 监听消息事件
  ws.on('message', function (message) {
    console.log('received: %s', message);

    // 接收到心跳消息,回复确认消息
    if (message === '{"type":"heartbeat"}') {
      ws.send('{"type":"heartbeat_ack"}');
    }
  });

  // 监听关闭事件
  ws.on('close', function () {
    // 停止心跳机制
    stopHeartbeat();
  });
});

四、WebSocket系统监控

WebSocket系统监控是通过监测WebSocket连接的状态,以及管理WebSocket连接的数量、资源消耗等信息,确保WebSocket系统的稳定可靠运行。

如下是一个WebSocket系统监控的实现示例:


// 定义存储WebSocket连接的数组
let connections = [];

// WebSocket连接监听
wss.on('connection', function (ws) {
  // 将连接对象加入数组
  connections.push(ws);

  // 监听关闭事件
  ws.on('close', function () {
    // 将连接对象从数组中移除
    connections.splice(connections.indexOf(ws), 1);
  });
});

// 定时监控WebSocket连接状态
setInterval(function () {
  let activeCount = 0;

  // 统计活跃连接数量
  connections.forEach(function (ws) {
    if (ws.readyState === WebSocket.OPEN) {
      activeCount++;
    }
  });

  // 输出连接状态及数量
  console.log(new Date(), 'Active:', activeCount, 'Total:', connections.length);

  // 检查系统负载情况,如果超过阈值则报警
  let loadavg = os.loadavg();
  let threshold = 2 * os.cpus().length;
  if (loadavg[0] >= threshold) {
    console.log(new Date(), 'System Overloaded!');
  }
}, 5000);

五、WebSocket高可用方案

WebSocket作为一种基于TCP长连接的协议,对高可用性的要求比较高。针对WebSocket系统的高可用方案,通常有如下几种:

六、总结

WebSocket心跳是保证交互信道持续可靠的重要机制,可以通过在客户端和服务端之间周期性地发送心跳消息,来确保连接在空闲状态时不被关闭。同时,服务端还需要在接收到客户端的心跳消息时,及时回复确认消息。除此之外,系统监控和高可用方案也是WebSocket系统开发和部署中需要重点考虑的问题。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT