当前位置:首页 > JavaScript

Js 心跳实现

2026-04-06 19:52:38JavaScript

心跳机制简介

心跳机制用于维持客户端与服务器的长连接,通过定时发送小数据包检测连接状态。在Web开发中常用于WebSocket或轮询场景,避免连接因超时被中断。

基于setInterval的实现

使用setInterval定时发送心跳消息,代码简单但可能因页面休眠或切换导致定时器不准确:

let heartbeatInterval = setInterval(() => {
  if (websocket.readyState === WebSocket.OPEN) {
    websocket.send('HEARTBEAT');
  }
}, 30000); // 30秒间隔

// 清除心跳
clearInterval(heartbeatInterval);

基于setTimeout的递归实现

递归调用setTimeout可避免休眠后定时器堆积的问题,更适合移动端场景:

function sendHeartbeat() {
  if (websocket.readyState === WebSocket.OPEN) {
    websocket.send('HEARTBEAT');
  }
  setTimeout(sendHeartbeat, 30000);
}
sendHeartbeat(); // 启动心跳

WebSocket心跳示例

结合WebSocket的onclose事件实现完整心跳检测:

Js 心跳实现

const websocket = new WebSocket('wss://example.com');
let pingTimeout;

function heartbeat() {
  clearTimeout(pingTimeout);
  pingTimeout = setTimeout(() => {
    websocket.close();
  }, 5000); // 5秒无响应则认为断开
}

websocket.onopen = () => {
  heartbeat();
  setInterval(() => {
    websocket.send('PING');
  }, 30000);
};

websocket.onmessage = (e) => {
  if (e.data === 'PONG') heartbeat();
};

优化建议

  • 心跳间隔通常建议20-60秒,需根据服务器配置调整
  • 添加重连机制,在心跳失败时自动重新连接
  • 使用二进制帧(如opcode 0x9)替代字符串消息提升效率
  • 考虑使用requestIdleCallback在浏览器空闲时发送心跳

标签: Js
分享给朋友:

相关文章

Js实现 toggle

Js实现 toggle

使用 classList.toggle 方法 通过 classList.toggle 可以轻松切换元素的类名。该方法接受一个类名作为参数,如果元素已存在该类名则移除,不存在则添加。 const bu…

Js实现decimal

Js实现decimal

实现 Decimal 类型的方法 在 JavaScript 中,原生不支持精确的 Decimal 类型,但可以通过以下方法实现高精度小数运算。 使用第三方库 推荐使用成熟的第三方库来处理 Decim…

Js实现划词翻译

Js实现划词翻译

划词翻译的实现思路 划词翻译功能可以通过监听用户鼠标选中文本的事件,获取选中的文本内容,然后调用翻译API进行翻译,最后将翻译结果显示在页面上。 获取选中文本 通过window.getSelecti…

Js实现const

Js实现const

在JavaScript中,const是用于声明常量的关键字,其特点如下: const的基本特性 声明时必须初始化,否则会抛出语法错误 不能重复声明同名变量 块级作用域(与let相同) 不允许重复赋值…

Js实现对齐

Js实现对齐

使用 CSS Flexbox 实现对齐 Flexbox 是一种现代的布局方式,可以轻松实现水平和垂直对齐。 水平居中 将子元素在父容器中水平居中: .parent { display:…

Js轮训实现

Js轮训实现

轮询的实现方法 轮询是一种通过定时向服务器发送请求来获取最新数据的技术,适用于需要实时更新的场景。以下是几种常见的实现方式: 使用setInterval实现基础轮询 function pollSe…