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

我有一个使用socket.io(node.js后端)分发消息到所有login客户端的生产应用程序。 我的许多用户正在与socket.io服务器断开连接。 客户端的正常使用情况是保持Web应用程序在整个工作日内打开。 应用程序在工作日大部分时间都是空闲的,但应用程序仍然是开放的 – 直到socket.io连接丢失,然后应用程序将它们踢出去。

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

看起来我们所能做的只是给你一些debuggingbuild议,以便你可以更多地了解是什么导致了问题。 所以,这是一个需要研究的事情。

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

  2. 确保客户端不会进入hibernate状态,使所有的networking连接都变为非活动状态。

  3. 在正在工作的客户端(在断开连接之前),使用Chromedebugging器,networking选项卡,webSockets子选项卡来validation您可以在客户端和服务器之间看到常规ping消息。 您必须打开debugging窗口,进入networking选项卡,然后使用打开的debugging窗口刷新网页,以开始查看networking活动。 你应该看到一个时髦的url,里面有?EIO=3&transport=websocket&sid=xxxxxxxxxxxx 。 点击那个。 然后点击“框架”子标签。 在这一点上,你可以看到个别的websocket数据包正在发送。 您应该每隔一段时间就看到一个长度为1的小数据包(这些是ping和pong keep-alive数据包)。 下面有一个示例屏幕截图,显示您正在寻找什么。 如果你没有看到这些保持活跃的数据包,那么你需要解决他们为什么不在那里(可能是一些socket.ioconfiguration或版本问题)。

  4. 既然你提到你可以重现这种情况,你想知道的一件事是如何closures套接字(客户端启动或服务器端启动)。 收集信息的一种方法是在客户端上安装一个networking分析器,以便从字面上观察每个通过networking进入/离开客户端的数据包。 有许多不同的分析仪,许多是免费的。 我个人曾经使用过提琴手,但我经常听到人们在谈论WireShark。 你想看到的就是当客户端失去连接时在networking上发生的事情。 客户端是否决定发送一个closures套接字数据包? 客户端是否收到来自某人的封闭套接字数据包? 在连接丢失时,networking上会发生什么。


Chromedebugging器中的webSocketnetworking视图

Chrome调试器中的webSocket网络视图

最可能的原因是由于不活动而closuresWebSocket的一端。 这通常由负载均衡器完成,但可能还有其他的罪魁祸首。 解决这个问题的方法是每隔一段时间(每30秒使用一次,但根据问题的不同,您可能会更高)发送一条消息给每个客户。 这将防止它出现不活动,从而closures。