浏览器里的 WebSocket 心跳需要应用层协议
当浏览器 JavaScript 无法直接发送 WebSocket Ping 帧时,设计一套双方约定的应用层心跳。
浏览器的 WebSocket API 有 send()。它并不提供通用的 ping() 方法让 JavaScript 发送协议层面的 Ping 帧。
如果你的应用发送类似 {"type":"heartbeat"} 的文本消息,那属于应用数据。服务器必须理解这条消息并定义响应。没有实现该约定的服务器,不会仅仅因为文本里出现 ping 这个词就回一个协议层面的 Pong。
要定义清楚确认的含义、它如何标识尚未完成的心跳,以及旧确认何时算太迟。把它与业务操作的确认区分开。
JavaScript 定时器同样受调度约束。后台标签页和繁忙的主线程都可能推迟回调。不要把错过一次精确的定时器边界当成代理停止转发的决定性证据。
浏览器可以在内部处理协议的控制帧,但这不会让应用代码以可移植的方式看到每一个 Ping 或 Pong。如果页面需要自己的存活判断,就使用明确的应用约定和恢复策略。
readyState 为 OPEN 的套接字只是在本地被视为打开;它并不是远端应用已经处理了上一条消息的独立测量。请使用与你要回答的问题相匹配的证据。