2010-06-02 52 views
1

上下文:主服务器(Java,TCP)监控托管游戏列表(主服务器和每个托管游戏服务器的不同机器)。任何用户都可以在他的PC上托管一个游戏。托管的游戏可以持续数周或数月。主控服务器的Java TCP保持活动

需要:了解托管游戏服务器何时关闭或不再可达。

限制1:不能靠托管服务器的‘水涨船高离线更新消息’,因为这些消息可能永远不会到来(掉电,网络链路中断等)

限制2:我不确定TCP的内置保持活动状态,因为它意味着每个托管服务器的24/7开放式套接字(纠正我,如果我错了)

有什么想法?

回答

1

这听起来像是你遇到了所谓的“两军问题”,“协调攻击问题”,或者如Andreas D指出的那样,你已经确定了Two General's Problem这是你的限制1。在这个问题背后是两支军队想要协调对敌人的攻击,他们需要同时攻击,因为每支军队都知道如果他们自己攻击就会死亡

问题是这样的:一个军队如何知道他们的使者,谁携带了用于协同攻击的时间,已经成功地到达了另一个军队?此外,第二军怎么能确定第一军知道他们收到了消息并计划进攻?军队之间的任何消息都可能不会'成功到达,因此军队永远无法确定它们是否得到妥善协调。

因此,最简单的答案可能是按照计划的时间间隔对每个正在运行的游戏执行ping操作,并且每当用户请求刷新时也执行ping操作。您可以使用此信息填充主列表。

+0

..也称为'两将军问题'http://en.wikipedia.org/wiki/Two_Generals%27_Problem – 2010-06-02 09:34:22

+0

... ping只显示机器是否仍然连接,但如果服务仍然可用,则不显示。 – 2010-06-02 09:36:57

+0

@Andreas - 当我说ping时,我的意思是他的服务器可以发送一个“嘿,你还活着吗?”消息给托管的游戏服务器。我并不是指实际的ping命令。 – angstrom91 2010-06-02 09:40:45

3

考虑使用某种心跳消息。这些消息(“我还活着!”)会定期发送,并且如果主服务器没有从托管服务器收到心跳消息(一段时间),它就会知道此托管服务器不可用。

,你甚至可以添加一些状态参数此消息,如果您需要从托管的服务器的详细信息(如“全面运作”,“5分钟准备停机维护”等)