首页 > 解决方案 > 如果我已经重新连接 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即使连接可能已断开也不会触发的情况?

标签: javascriptwebsocketpingpong

解决方案


如果连接被明确关闭,您将onclose几乎立即得到一个,但如果连接中断,例如当您断开以太网电缆时,需要一些时间才能得到一个onclose,可能不会在 TCP 检测到连接丢失之前。这可能需要几分钟,具体取决于您的设置。

顺便说一句,它不一定是 Ping/Pong;由服务器发送并在浏览器中接收和处理的心跳有时更容易实现。


推荐阅读