我想在服务器中实现心跳功能,该功能会定期提醒窗口客户端其活跃度。我正在考虑的想法很少,但会很感激建议和示例/参考
有一个单独的线程可以将心跳发送到已连接的客户端
具有不同类型的心跳以指示服务器的不同状态 (缓慢,快速,客户不堪重负,准备就绪)
也许让客户订阅不同级别,默认发送心跳
我真的很想看看它在实践中是如何完成的,例子最好。
EDIT 1 客户端和服务器不是基于网络的! (服务器可能会迁移到Web,但我认为它不应该更改协议)
答案 0 :(得分:2)
使用Josh提到的拉模型是最简单的方法。首先,你会遇到很多安全问题。无需担心客户端防火墙。此外,您无需担心必须在每个客户端上打开相同的端口,或打开动态端口并通知服务器有关正在使用的客户端上的端口。
此外,您不必在服务器上维护订户列表。此外,如果客户端以不太干净的方式(应用程序崩溃,电源故障等)断开连接,您将无需担心清理订户列表。
基本上,从客户端到服务器上的服务的简单轮询是最简单和最干净的方法,恕我直言。我已经好几次使用它了。如果选择,您甚至可以使用户可配置轮询间隔。
编辑:
虽然我无法提供参考或示例代码,但我将描述我过去所做的事情。
基本上,我有一个Web服务,当查询时,它将返回系统的状态。这个Web服务显然在服务器上运行。客户端在启动时将启动一个单独的线程,该线程每30秒查询一次Web服务以获取服务器系统的状态。然后,UI将被更新以指示该状态。一旦该任务完成,该线程将重新进入休眠状态30秒。更新时间可通过配置文件进行配置。只需确保捕获错误,以便如果服务请求因服务器关闭以外的原因而失败,则整个应用程序不会崩溃。
答案 1 :(得分:2)
这几乎肯定是矫枉过正,但是有一整套(并且非常生动)的学科正在研究失效探测器的类别,它们可以提供什么样的保证,以及它们如何实际实施。对于那些想要比这个提问者暗示更远的人,请看看:
Book Series - Book Title - Distributed Computing Chapter Title - On the Impact of Fast Failure Detectors on Real-Time Fault-Tolerant Systems First Page - 354 Last Page - 369 Copyright - 2002 Author - Marcos K. Aguilera Author - Gérard Le Lann Author - Sam Toueg DOI - 10.1007/3-540-36108-1_24 Link - http://www.springerlink.com/content/e03yf4etbnle9728
Book Title - Distributed Algorithms Chapter Title - Heartbeat: A timeout-free failure detector for quiescent reliable communication First Page - 126 Last Page - 140 Copyright - 1997 Author - Marcos Kawazoe Aguilera Author - Wei Chen Author - Sam Toueg DOI - 10.1007/BFb0030680 Link - http://www.springerlink.com/content/dj5n71hl17841416
此外,问题尚不清楚,但如果所讨论的语言是Java,那么这个主题的优秀资源是:Introduction to Reliable Distributed Programming,有很多优秀的示例代码。
答案 2 :(得分:1)
我们在谈论什么样的客户? Windows客户端还是asp.net?这有两种非常普遍的模式。您可以推送或拉取数据。如果您在互联网上遇到防火墙和nat,推送不起作用。因此,您最终得到了客户端启动连接的第三种变体,服务器保持连接打开以来来回发送信息。
您需要提供更多信息,我们是在谈论互联网还是内部网?您定位的.net框架是什么?你在说几个客户?可以处理十几个客户端的解决方案(特别是在推送模型或第三个模型中)可能与可扩展到数千个客户端的解决方案看起来非常不同。
最简单的解决方案是从客户端进行轮询,除非您希望服务器与客户端进行即时通信,否则就可以了。心跳不是即时沟通。
好的,你指的是套接字,你真的确定要进行更低级别的网络类型编程吗?为什么不建立在现有的网络策略上,比如HTTP。您可以通过HTTP执行简单的远程服务,以便绕过防火墙。或者甚至更好,如果您的服务器是一个Web服务器,那么只需设置一个普通的旧xml服务。
我没有任何可以与之分享的例子,但应该有很多。