当前位置:首页 > JavaScript

Js 心跳实现

2026-04-06 19:52:38JavaScript

心跳机制简介

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

Js 心跳实现

基于setInterval的实现

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

Js 心跳实现

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事件实现完整心跳检测:

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实现reset

Js实现reset

使用 HTMLFormElement.reset() 方法 通过 JavaScript 直接调用表单的 reset() 方法可以重置表单内的所有输入字段为初始值: document.getEleme…

Js轮训实现

Js轮训实现

轮询的实现方法 轮询(Polling)是一种客户端定期向服务器发送请求以获取最新数据的技术。适用于实时性要求不高的场景,实现简单但可能增加服务器负载。 使用setInterval实现基础轮询 通过s…

Js实现 toggle

Js实现 toggle

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

Js 扫描实现

Js 扫描实现

实现 JavaScript 扫描功能 JavaScript 扫描功能通常涉及文件系统遍历、内容分析或网络请求监控。以下是几种常见场景的实现方法: 文件系统扫描 使用 Node.js 的 fs 模块可…

Js实现utext

Js实现utext

实现 UText 的基本方法 使用 JavaScript 实现 UText(Unicode 文本处理)可以通过多种方式完成,具体取决于需求。以下是几种常见实现方式: 创建基础 UText 对象:…

Js实现const

Js实现const

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