NodeJS Einaros WS 连接超时

7
我正在使用Node JS上的Einaros WS模块在一台电脑(服务器)上,并且当我使用另一台电脑(客户端)连接时,它可以正常工作。
如果我插入网络电缆,则ws.on('close', function()...不会触发,我正在寻求建议是否:
- 我需要实现自己的ping/pong,还是 - 有内置功能可以自动处理这个问题。

1
Einaros WS模块并没有为任何功能提供便利,您应该自己实现它。请参见我的答案以回答您的其他问题。 - mekwall
1个回答

17

Einaros WS具有发送Ping和Pong帧的能力,这些帧可以被大多数浏览器和套接字框架所理解。我已经在iOS上使用Socket Rocket进行了测试,并且它没有问题地理解Einaros的Ping帧。您需要想出应用程序特定逻辑来决定ping的频率以及容忍多少个未收到pong。 Einaros WS具有ping()和pong()函数可用于发送ping或pong。您可以监听“pong”事件以了解客户端何时响应。以下是我的代码实现:

wss.on("connection", function(ws) {
    console.log("websocket connection open");
    ws.pingssent = 0;
    var interval = setInterval(function() {
        if (ws.pingssent >= 2) {// how many missed pings you will tolerate before assuming connection broken.
            ws.close();
        } else {
            ws.ping();
            ws.pingssent++;
        }
    }, 75*1000);// 75 seconds between pings
    ws.on("pong", function() { // we received a pong from the client.
        ws.pingssent = 0; // reset ping counter.
    });
});

对于 Socket Rocket,客户端不需要编写任何代码。因此兼容的浏览器和客户端将自动响应 Pong。


我有一个困惑:如何发送PONG。这个问题解决了我的困惑https://dev59.com/rmkv5IYBdhLWcg3wdQhT。浏览器会自动发送PONG。还可以参考:https://github.com/websockets/ws/issues/316 - Sourav Ghosh
此外,还要使用ws.ping(null,null,true);,否则,如果客户端断开连接且服务器尝试在定时间隔时间内发送 ping,则ws服务器将抛出错误。参见:https://github.com/websockets/ws/blob/master/doc/ws.md#websocketpingdata-options-dontfailwhenclosed - Sourav Ghosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接