服务器和客户端之间实现心跳的模式

6
我想在服务器中实现一个心跳功能,定期向 窗口客户端 发送警报以告知其存活状态。我正在考虑一些想法,但希望能得到建议和示例/参考资料。
以下是几种可能的想法:
  • 创建一个单独的线程,向连接的客户端发送心跳

  • 创建不同类型的心跳,表示服务器的不同状态(缓慢、快速、客户端过多、启动并准备好)

  • 让客户端订阅不同级别,将默认发送心跳

我真的很想看看实际上是如何完成的,最好提供示例。 编辑1:客户端和服务器都不是基于Web的!(服务器可能迁移到Web,但我认为这不应该对协议产生太大影响)。

1
请详细说明。Web服务?远程调用?WCF? - Anton Gogolev
没有那些,因为我正在使用常规套接字。 - Sasha
3个回答

2
使用Josh提到的拉模型是最简单的方法。首先,这样做可以解决许多安全问题。无需担心客户端防火墙问题。而且,您不需要担心在每个客户端上打开相同的端口,或打开动态端口并通知服务器正在使用哪个客户端的哪个端口。
此外,您不必在服务器上维护订阅者列表。另外,如果客户端以不太干净的方式断开连接(应用程序崩溃、断电等),您也不需要担心清除订阅者列表。
基本上,从客户端定期轮询服务器服务是最简单和最干净的方法,在我看来。我已经使用过几次了。如果您愿意,甚至可以将轮询间隔设置为可由用户配置。
编辑:
虽然我不能提供参考或示例代码,但我会描述过去所做的事情。
基本上,我有一个Web服务,当查询时,它会返回系统状态。此Web服务显然在服务器上运行。启动客户端时,将启动一个单独的线程,该线程每30秒查询一次Web服务以获取服务器系统的状态。然后,更新UI以指示该状态。完成该任务后,线程将休眠30秒钟。更新时间可以通过配置文件进行配置。只需确保捕获错误,以便如果某个请求因其他原因而失败,而不是服务器宕机,整个应用程序不会崩溃。

2
这几乎肯定是过度设计,但有一个完整(而且非常活跃)的学科在研究故障探测器类别、它们可以提供什么样的保证以及如何实际实现它们。对于那些想要更深入了解此问题的人,请参阅以下内容:
书籍系列 -
书名 - 分布式计算
章节标题 - 快速故障检测器对实时容错系统的影响
第一页 - 354
最后一页 - 369
版权 - 2002
作者 - Marcos K. Aguilera
作者 - Gérard Le Lann
作者 - Sam Toueg
DOI - 10.1007/3-540-36108-1_24
链接 - [链接](https://doi.org/10.1007/3-540-36108-1_24)
书名 - 分布式算法
章节标题 - Heartbeat:一种无超时的静默可靠通信故障检测器
第一页 - 126
最后一页 - 140
版权 - 1997
作者 - Marcos Kawazoe Aguilera
作者 - Wei Chen
作者 - Sam Toueg
DOI - 10.1007/BFb0030680
链接 - http://www.springerlink.com/content/dj5n71hl17841416
此外,虽然从问题中不清楚使用的语言是否为Java,但关于这个主题的一个优秀资源是:可靠分布式编程介绍,其中有许多优秀的示例代码。

1
我们在谈论什么样的客户端?Windows客户端还是asp.net?这有两种非常普遍的模式。您可以推送或拉取数据。如果您在互联网上进行推送,将会遇到防火墙和NAT的问题。因此,您最终会得到第三个变体,即客户端启动连接,服务器保持连接以便来回发送信息。
您需要提供更多信息,我们是在讨论互联网还是内部网络?您正在针对哪个.NET框架?您要处理多少个客户端?能够处理几十个客户端的解决方案(特别是在推送模型或第三个模型中)可能与能够扩展到数千个客户端的解决方案大不相同。
最简单的解决方案是从客户端进行轮询,除非您希望服务器与客户端进行即时通信,否则这是正确的方法。而心跳并不是即时通信。
编辑
好的,您指出了套接字,您真的确定要进行低级网络类型编程吗?为什么不建立在现有的网络策略基础上,例如HTTP?您可以通过HTTP进行简单的远程服务,这将让您绕过防火墙。或者,如果您的服务器是Web服务器,则只需设置一个普通的XML服务即可。

我没有可以分享的任何示例,但应该有很多。


编辑......感谢指出缺失的部分。请解释一下推送和拉取数据的过程。 - Sasha
它根本不会是基于网络的,因此无法使用HTTP——而且它有点慢... 我的其余架构都是低级别的,所以我希望保持在那个层面上... - Sasha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接