主服务器的Java TCP保持活动状态

主服务器的Java TCP保持活动状态,java,tcp,keep-alive,Java,Tcp,Keep Alive,上下文:主服务器(Java、TCP)监控托管游戏列表(主服务器和每个托管游戏服务器的不同机器)。任何用户都可以在其PC上托管游戏。托管的游戏可以持续数周或数月 需要:知道托管游戏服务器何时关闭或无法访问 限制1:不能依赖托管服务器的“离线更新消息”,因为这些消息可能永远不会到达(断电、互联网链接中断等) 限制2:我不确定TCP内置的保持活动,因为这意味着每个托管服务器都有一个24/7开放的套接字(如果我错了,请纠正我) 你有什么想法吗?这听起来像是你遇到了所谓的“两军问题”,该组织说“协调攻击问

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

需要:知道托管游戏服务器何时关闭或无法访问

限制1:不能依赖托管服务器的“离线更新消息”,因为这些消息可能永远不会到达(断电、互联网链接中断等)

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


你有什么想法吗?

这听起来像是你遇到了所谓的“两军问题”,该组织说“协调攻击问题,或者,正如Andreas D所指出的,您已经确定为您的限制1。这个问题背后的想法是两军想要协调对敌人的进攻。他们需要同时进攻,因为每一支军队都知道,如果他们自己进攻,他们就会死亡

问题是:一支军队如何知道他们的信使,谁是负责协调攻击的时间,已经成功到达另一支军队?此外,第二集团军如何确保第一集团军知道他们收到信息并计划进攻?军队之间的任何信息都有可能无法成功到达,因此军队永远无法确定它们是否正确协调


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

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


如果您需要来自托管服务器的更详细信息(如“完全运行”、“5分钟内停机维护”等),甚至可以在此消息中添加一些状态参数。

。。也被称为“两将军问题”。。。ping仅显示机器是否仍然连接,而不显示服务是否仍然可用。@Andreas-我说ping时,我的意思是他的服务器可以向托管的游戏服务器发送“嘿,你还活着吗?”消息。我指的不是实际的ping命令。好吧:-)想到技术;)清晰准确的答案!非常感谢你们两位。