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

ETo*_*reo 10 node.js socket.io-1.0

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

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

jfr*_*d00 7

看来我们在这里所做的就是给你一些调试建议,以便你可以了解更多导致问题的原因.所以,这是一个要查看的事项列表.

  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.您希望看到的是客户端失去连接时网络上发生的情况.客户端是否决定发送关闭套接字数据包?客户端是否收到某人的关闭套接字数据包?连接丢失时网络上发生了什么.


Chrome调试器中的webSocket网络视图

Chrome调试器中的webSocket网络视图


Aar*_*our 1

最可能的原因是一端由于不活动而关闭了 WebSocket。这通常是由负载均衡器完成的,但可能还有其他原因。解决这个问题的方法是每隔一段时间向每个客户端发送一条消息(我使用 30 秒,但根据问题,您可能可以更高)。这将防止它看起来不活动并因此被关闭。

  • socket.io 已经执行自动心跳消息来保持连接打开并检测连接何时断开。因此,无需发送您自己的消息。似乎有其他原因(除了不活动之外)导致连接关闭。 (6认同)