WebSocket前端自动发心跳包 WebSocket定时器发送Ping消息【代码】

浅婷小哥_6120

浅婷小哥_6120

2026-06-03

1038人浏览

原创

websocket连接后不发心跳,服务端默认60秒无数据即断连;因原生api不支持自动ping,须前端用setinterval每30–45秒主动send("ping"),并在onclose/onerror中clearinterval,配合失败计数与onmessage清零机制实现可靠保活。

websocket前端自动发心跳包 websocket定时器发送ping消息【代码】

WebSocket连接后不发心跳,服务端主动断连怎么办

多数 WebSocket 服务端(如 Nginx 代理、Spring Boot 的 WebSocketHandler、或云厂商网关)默认 60 秒无数据就关闭空闲连接。前端不主动发 Ping,连接大概率在 1–2 分钟内被静默断开。

浏览器原生 WebSocket 对象**不支持自动发送 Ping 帧**——这是关键前提。所谓“心跳”,必须由前端用业务消息模拟(比如发 {"type":"ping"}),或靠定时器触发 send()。

  • 别依赖 ws.ping():该方法不存在,WebSocket API 没有暴露底层 Ping 控制权
  • 别等 onmessage 回应再发:服务端可能只收不回,心跳只需单向保活
  • 首次心跳应在 onopen 后立即启动,避免刚连上就因延迟触发而掉线

用 setInterval 发心跳的正确姿势

最直接的方式是连接就绪后启动定时器,但要注意清理逻辑和异常兜底。

核心原则:定时器 ID 必须绑定到实例上(比如挂到 ws.heartbeatId),且在 onclose 和 onerror 中清除,否则页面未卸载时定时器持续运行,可能对已断开的 ws 调用 send() 报错 InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state。

  • 推荐间隔设为 30–45 秒,比服务端超时阈值小 10–15 秒,留出网络抖动余量
  • 心跳内容建议用轻量字符串,如 "ping" 或 {"t":"h"},避免 JSON 序列化开销
  • 不要在定时器里检查 ws.readyState === WebSocket.OPEN 后再发——这个判断本身就有竞态,应优先 try/catch 包裹 send()
const ws = new WebSocket('wss://api.example.com/ws');
ws.onopen = () => {
  ws.heartbeatId = setInterval(() => {
    try {
      ws.send('ping'); // 纯字符串最快
    } catch (e) {
      // send 失败说明连接已异常,主动 close 触发重连逻辑
      ws.close();
    }
  }, 35000);
};
<p>ws.onclose = () => {
if (ws.heartbeatId) clearInterval(ws.heartbeatId);
};</p><p>ws.onerror = () => {
if (ws.heartbeatId) clearInterval(ws.heartbeatId);
};</p>

心跳失败后要不要重连?怎么判断是真断连还是临时抖动

单纯 send() 抛异常不能直接判定连接死亡——可能是瞬间阻塞、浏览器切后台冻结定时器、或服务端短暂不可达。盲目重连反而加重服务端压力。

更稳妥的做法是:连续 2–3 次心跳 send() 失败(且间隔内无 onmessage 到达),再触发重连。可借助计数器 + 时间窗口控制:

PigX UI 前端开发
PigX UI 前端开发

PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。

下载
  • 每次 send() 成功,重置失败计数 ws.pingFailCount = 0
  • 每次 catch 到错误,计数加一;若 pingFailCount >= 3,执行 ws.close() 并启动重连流程
  • 同时监听 onmessage,只要收到任意消息,立刻清零计数——说明链路实际畅通

注意:Chrome 在页面后台时,setInterval 可能被节流到最低 1 分钟一次,此时靠心跳保活会失效。如需强保活,得结合 Page Visibility API 检测可见性,后台时改用 setTimeout 递归+更宽松的间隔。

用 AbortController 管理心跳定时器是否更现代

目前不推荐。虽然 AbortController 能统一取消异步操作,但它**无法取消 setInterval** ——clearInterval 仍需手动调用。强行包装成 Promise 并用 abort() 触发清理,反而增加心智负担和兼容性风险(IE 完全不支持)。

真正值得升级的是心跳协议设计本身:如果服务端支持标准 WebSocket Ping 帧(RFC 6455),前端无需发业务心跳,只要确保 TCP 层不被中间设备 kill 即可——但这取决于服务端实现,前端无法控制。

所以现阶段,老老实实用 setInterval + 清理逻辑 + 失败计数,是最可控、兼容性最好、也最容易 debug 的方案。

容易被忽略的一点:移动端 WebView(尤其旧版 Android)对定时器精度极不敏感,30 秒定时器可能偏差 5–10 秒,心跳间隔宁可设宽松些,别卡死 30000 这个数字。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5003

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6090

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5598

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

803

5

C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2949

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2208

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1180

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1118

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习