socket.io在空闲时断开客户端

时间:2015-05-16 20:40:17

标签: node.js socket.io-1.0

我有一个生产应用程序,它使用socket.io(node.js后端)将消息分发给所有登录的客户端。我的许多用户都遇到了与socket.io服务器断开连接的问题。客户端的正常用例是使Web应用程序在整个工作日保持打开状态。应用程序在工作日的大部分时间都是闲置的,但应用程序仍然处于打开状态 - 直到socket.io连接丢失,然后应用程序将它们踢出去。

有什么方法可以让连接更可靠,所以我的用户不会经常失去与socket.io服务器的连接?

2 个答案:

答案 0 :(得分:6)

看来我们所能做的就是给你一些调试建议,以便你可以了解更多导致问题的原因。所以,这里有一系列要研究的内容。

  1. 确保socket.io配置为自动重新连接。在最新版本的socket.io中,自动重新连接默认为打开,但您可能需要验证没有任何代码将其关闭。

  2. 确保客户端不会休眠,以便所有网络连接都变为非活动状态断开连接。

  3. 在正常工作的客户端中(在断开连接之前),使用Chrome调试器,网络选项卡,webSockets子选项卡验证您是否可以看到客户端和服务器之间的常规ping消息。您必须打开调试窗口,进入网络选项卡,然后在打开调试窗口的情况下刷新您的网页,以开始查看网络活动。您应该会看到一个外观时髦的网址,其中包含?EIO=3&transport=websocket&sid=xxxxxxxxxxxx。点击它。然后单击“Frames”子标签。此时,您可以观看正在发送的各个websocket数据包。您应该偶尔看到长度为1的微小数据包(这些是ping和pong keep-alive数据包)。下面有一个示例屏幕截图,显示您正在寻找的内容。如果您没有看到这些保持活动的数据包,那么您需要解决它们不存在的原因(可能是一些socket.io配置或版本问题)。

  4. 由于您提到可以重现这种情况,您想知道的一件事是套接字如何关闭(客户端启动或服务器端启动)。收集信息的一种方法是在您的客户端上安装网络分析器,这样您就可以逐字地观察通过网络进出客户端的每个数据包。有许多不同的分析仪,许多是免费的。我个人使用过Fiddler,但我经常听到有人在谈论WireShark。您希望看到的是客户端失去连接时网络上发生的情况。客户端是否决定发送关闭套接字数据包?客户端是否收到某人的关闭套接字数据包?连接丢失时网络上会发生什么。

  5. Chrome调试器中的webSocket网络视图

    webSocket network view in Chrome Debugger

答案 1 :(得分:1)

最可能的原因是由于不活动而导致一端关闭WebSocket。这通常由负载平衡器完成,但可能还有其他罪魁祸首。解决这个问题的方法是简单地每隔一段时间发送一条消息(我使用30秒,但根据问题你可能会更高)。这样可以防止它显示为不活动状态,从而被关闭。