我有一个生产应用程序,使用socket.io (node.js后端)来向所有已登录客户端分发消息。许多用户经常从socket.io服务器断开连接。通常客户端的使用情况是整个工作日都保持Web应用程序处于打开状态。在一天的大部分时间里,应用程序处于空闲状态,但是应用程序仍然处于打开状态——直到socket.io连接丢失,然后应用程序将被退出。
是否有任何方法可以使连接更可靠,以便我的用户不会经常失去与socket.io服务器的连接?
我有一个生产应用程序,使用socket.io (node.js后端)来向所有已登录客户端分发消息。许多用户经常从socket.io服务器断开连接。通常客户端的使用情况是整个工作日都保持Web应用程序处于打开状态。在一天的大部分时间里,应用程序处于空闲状态,但是应用程序仍然处于打开状态——直到socket.io连接丢失,然后应用程序将被退出。
是否有任何方法可以使连接更可靠,以便我的用户不会经常失去与socket.io服务器的连接?
确保socket.io已配置为自动重新连接。 在最新版本的socket.io中,自动重新连接默认为打开状态,但您可能需要验证是否有任何代码将其关闭。
确保客户端未休眠,以使所有网络连接变得不活跃并断开连接。
在工作正常的客户端(在其断开连接之前)中,使用Chrome调试器,Network标签,webSockets子标签来验证您是否可以看到客户端和服务器之间的定期ping消息。 您将不得不打开调试窗口,进入网络选项卡,然后使用该调试窗口刷新您的网页以开始查看网络活动。 您应该会看到一个带有?EIO = 3& transport = websocket& sid = xxxxxxxxxxxx 的奇异URL。 点击那个URL。 然后单击“框架”子标记。 此时,您可以观看发送的单个websocket数据包。 您应该会偶尔看到长度为1的小数据包(这些是ping和pong保持活动数据包)。 下面有一个示例屏幕截图,显示您要查找的内容。 如果您没有看到这些保持活动的数据包,则需要解决它们不存在的原因(可能是一些socket.io配置或版本问题)。
由于您提到您可以重现此情况,因此您想要知道套接字是如何关闭的(客户端端还是服务器端引发)。 收集有关此信息的一种方法是在客户端上安装网络分析器,以便您可以实际上观看每个发送到/从您的客户端的数据包。 有许多不同的分析器,其中许多是免费的。 我个人使用过Fiddler,但我经常听到人们谈论WireShark。 您想要查看的是当客户端失去连接时网络上会发生什么。 客户端是否决定发送关闭套接字数据包? 客户端是否收到来自某个人的关闭套接字数据包? 连接断开时网络上发生了什么。
Chrome调试器中的webSocket网络视图
![webSocket network view in Chrome Debugger](https://istack.dev59.com/Y7s0W.webp)