javascript - 如果我已经重新连接 onclose(),为什么还需要 ping-pong 来检测 websocket 连接断开?
问题描述
我有连接到外部 WebSocket API 的代码,如下所示:
const WebSocket = require('ws')
const ws = new WebSocket('wss://example.com/')
const connectExternalAPI() => {
ws.onopen = () => { ws.send(JSON.stringify('example': 'message')) }
ws.onerror = (event) => { console.error(event) }
ws.onmessage = (event) => { console.log(event.data) }
ws.onclose = (event) => {
console.error(event)
setTimeout(connectExternalAPI, 10000)
}
}
由于我已经尝试在每次连接获得时重新连接到 API ,所以当这已经完成相同的事情时onclose
,还有什么必要额外实施ping-pong
以检测连接断开(并尝试重新连接)?
是否存在onclose
即使连接可能已断开也不会触发的情况?
解决方案
如果连接被明确关闭,您将onclose
几乎立即得到一个,但如果连接中断,例如当您断开以太网电缆时,需要一些时间才能得到一个onclose
,可能不会在 TCP 检测到连接丢失之前。这可能需要几分钟,具体取决于您的设置。
顺便说一句,它不一定是 Ping/Pong;由服务器发送并在浏览器中接收和处理的心跳有时更容易实现。