上下文:主服务器(Java、TCP)监控托管游戏列表(主服务器和每个托管游戏服务器的不同机器)。任何用户都可以在他的 PC 上托管游戏。托管游戏可持续数周或数月。
需要:了解托管游戏服务器何时关闭或不再可访问。
限制 1:不能依赖托管服务器的“离线更新消息”,因为这些消息可能永远不会到达(断电、互联网链接断开等)
限制 2:我不确定 TCP 的内置 keep-alive,因为这意味着每个托管服务器都有一个 24/7 开放的套接字(如果我错了,请纠正我)
有什么想法吗?
上下文:主服务器(Java、TCP)监控托管游戏列表(主服务器和每个托管游戏服务器的不同机器)。任何用户都可以在他的 PC 上托管游戏。托管游戏可持续数周或数月。
需要:了解托管游戏服务器何时关闭或不再可访问。
限制 1:不能依赖托管服务器的“离线更新消息”,因为这些消息可能永远不会到达(断电、互联网链接断开等)
限制 2:我不确定 TCP 的内置 keep-alive,因为这意味着每个托管服务器都有一个 24/7 开放的套接字(如果我错了,请纠正我)
有什么想法吗?
考虑使用某种心跳消息。这些消息(“我还活着!”)会定期发送,如果主服务器(在一定时间内)没有从托管服务器收到心跳消息,它就知道该托管服务器不可用。
如果您需要来自托管服务器的更详细信息(例如“完全可操作”、“5 分钟后进行维护”等),您甚至可以在此消息中添加一些状态参数
听起来您遇到了所谓的“两军问题”、“协同攻击问题”,或者,正如 Andreas D 所说,您已将其确定为限制 1的两个将军问题。这背后的想法问题是两军要协同进攻,需要同时进攻,因为每支军队都知道自己进攻会死。
问题是这样的:一支军队怎么知道他们的信使,他正在携带预定的协同攻击的时间,已经成功地到达了另一支军队?更何况,第二军怎么能确定第一军知道自己收到了消息,打算出击呢?军队之间的任何消息都可能没有成功到达,因此军队永远无法确定它们是否得到了适当的协调。
正因为如此,最简单的答案可能是在预定的时间间隔内对每个正在运行的游戏进行一次 ping,并且在用户请求刷新时也进行一次 ping。您可以使用此信息来填充您的主列表。