【发布时间】:2016-04-21 00:20:14
【问题描述】:
我想在未定义的时间内保持 Websocket 连接处于活动状态。理想情况下,套接字会每隔一段时间发送一次数据,但这并不能保证,而且我也不想做出假设,因为用户可能处于空闲状态。
我有一个存储对所有 websocket 连接的引用的对象。我是否适合每 x 分钟安排一次功能?秒?基本上遍历所有连接,对它们执行 ping 操作,然后丢弃那些没有收到 pong 的连接?还是我需要启用一个自动保持连接活动的标志?
我在服务器上使用 ws 库,但在客户端本地创建 websocket 连接。
【问题讨论】:
-
我反对这个。如果某些负责连接中间的路由器或其他设备的网络管理员认为通过它的连接非常宝贵,可以丢弃,那么您真的没有必要欺骗他/它不这样做。无论如何,您实际上无法阻止它的发生:您仍然必须处理断开的连接;那么好处在哪里呢?值得注意的是,大约是地球上最常用的应用程序协议 HTTP 并没有这样做。
-
那么您将如何排除陈旧的连接?在这种情况下,陈旧意味着它们没有发出关闭事件,但不再可用。
-
socket.io(使用 webSocket 连接)添加了一个常规 ping 来检测过时的连接并帮助防止网络基础设施超时非活动连接。添加自己是非常可行的(webSocket 协议甚至定义了 ping 和 pong 数据包),或者您可以在客户端和服务器上使用 socket.io,它会为您完成。