讲师中心 微信公众号
AI工具推荐 视频效率加速

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

浅婷小哥_6120

浅婷小哥_6120

发布时间:2026-06-03 17:53:25

|

1038人浏览过

|

来源于php中文网

原创

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);
};

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

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

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

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

下载

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

  • 每次 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 这个数字。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

2323

2023.08.11

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

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

4983

2023.10.09

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

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

6070

2024.03.19

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

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

5598

2024.03.22

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

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

783

2024.05.22

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

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

2929

2023.06.20

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

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

2208

2023.07.25

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

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

1180

2023.08.02

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn