在客户端为 websockets 实现心跳的更好方法是什么?

Which is the better way to implement heartbeat on the client side for websockets?

在 websockets 的服务器端,已经有一个 ping/pong 实现,其中服务器发送一个 ping,客户端用一个 pong 回复,让服务器判断客户端是否连接。但是没有反向实现让客户端知道服务器是否仍然连接到它们。

我读过有两种方法可以解决这个问题:

您可以使用任何一种方法在客户端尝试确定服务器是否仍然在线。第一个您将向服务器发送流量,而第二个您将向服务器发送流量。两者似乎都很容易实施,但我不确定哪种方法更 efficient/cost 有效。

服务器上传速度高于客户端上传速度,但服务器 CPU 是一种昂贵的资源,而客户端 CPU 相对便宜。将逻辑卸载到客户端是一种更具成本效益的方法...

话虽如此,服务器 必须 实现此特定逻辑(实际上,所有 ping/timeout 逻辑),否则它们可能会留下 "half-open" sockets 耗尽资源但未连接到任何客户端。

请记住,套接字(文件描述符)是一种有限的资源。它们不仅在没有流量时使用内存,而且在资源用尽时阻止新客户端连接。

因此,服务器必须使用超时或通过实现 ping.

清除死套接字

P.S.

我不是 node.js 专家,但这种类型的逻辑应该使用 Websocket 协议 ping 而不是您的应用程序来实现。您可能应该查看 node.js 服务器/websocket 框架并检查如何启用 ping-ing.

您应该设置 pings 以适应您的特定环境。也就是说,如果您在 Heroku 上托管,那么 Heroku 将实施约 55 秒的超时,并且您的 ping 应该在此超时发生之前发送。