
我们需要的是协议层的内置心跳(确保连接存活检测),而不是依赖前端的业务层心跳(避免定时器失效问题)。
为什么 WebSocket 的内置心跳能解决问题?
WebSocket 协议定义了ping和pong帧(属于控制帧,不承载业务数据),工作流程如下:
- 服务器定期发送 ping 帧(如每 30 秒)给客户端。
- 浏览器自动返回 pong 帧(无需前端 JS 参与,由浏览器内核处理)。
- 若服务器连续多次(如 3 次)未收到 pong 帧,则判定连接已断开,触发
onClose事件记录退出时间。
这种机制的优势在于:
不受前端定时器节流影响:ping/pong 由协议层处理,与前端 JS 的定时器无关(避免浏览器对后台标签页的定时器限制)。
完全不依赖前端页面状态:即使浏览器最小化、页面无交互、JS 线程被阻塞,浏览器内核仍会自动响应 ping 帧。
回复 Mr.Zhao 取消回复