首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在websockets的客户端实现心跳的更好方法是哪一种?

问在websockets的客户端实现心跳的更好方法是哪一种?
EN

Stack Overflow用户
提问于 2017-03-15 22:03:13
回答 1查看 4.3K关注 0票数 1

在websockets的服务器端,已经有了ping/pong实现,其中服务器发送ping,客户端用保持式应答,让服务器节点(无论客户端是否连接)。但是没有反向实现的东西可以让客户端知道服务器是否仍然连接到它们。

关于这一点,我读过两种方法:

  • ​
    1. 每个客户端每x秒向服务器发送一条消息,当发送时抛出错误时,这意味着服务器已关闭,所以请重新连接。

​

  • ​
    1. 服务器每隔x秒向每个客户端发送一条消息,客户端收到此消息并更新客户端上的变量,客户端上有一个线程,每x秒检查一次,该线程检查该变量是否已更改,如果该变量有一段时间没有更改,则意味着它尚未从服务器接收到消息,您可以假设服务器已关闭,因此可以重新建立连接。

​

您可以尝试在客户端使用这两种方法来确定服务器是否仍然在线。第一个是将流量发送到服务器,而第二个则是将流量从服务器发送出去。这两种方法似乎都很容易实现,但我不太确定哪一种方法更有效/更有成本效益。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-16 00:36:50

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

话虽如此,服务器必须实现这个特定的逻辑(实际上,所有的ping/timeout逻辑),否则它们可能会被留给消耗资源但没有连接到任何客户端的“半开”插座。

请记住,套接字(文件描述符)是一个有限的资源。它们不仅在没有通信量的情况下使用内存,而且在资源最大化时阻止新客户端连接。

因此,服务器必须清除死套接字,要么使用超时,要么通过实现ping。

附注:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42821529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档