【问题标题】:Java TCP keep-alive for a master server主服务器的 Java TCP 保持活动状态
【发布时间】:2010-06-02 17:47:18
【问题描述】:

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: java tcp keep-alive


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      听起来你遇到了所谓的“两军问题”、“协同攻击问题”,或者,正如 Andreas D 所说,Two General's Problem 您已将其确定为限制 1。这个问题背后的想法是,两支军队要协同进攻,他们需要同时进攻,因为每支军队都知道自己进攻会死。

      问题是这样的:一个军队怎么知道他们的信使,谁正在携带预定的协同攻击的时间,已经成功地到达了另一个军队?而且,第二军怎么能确定第一军知道他们收到了消息,打算出击呢?军队之间的任何消息都可能没有成功到达,因此军队永远无法确定他们是否得到了适当的协调。

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

      【讨论】:

      • .. 也称为“双将军问题”en.wikipedia.org/wiki/Two_Generals%27_Problem
      • ... ping 只显示机器是否仍然连接,但如果服务仍然可用则不显示。
      • @Andreas - 当我说 ping 时,我的意思是他的服务器可以发送“嘿,你还活着吗?”向托管游戏服务器发送消息。我指的不是实际的 ping 命令。
      • OK :-) 从技术角度思考 ;)
      • 清晰准确的答案!非常感谢你们。
      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2020-01-15
      • 2019-09-01
      • 2018-12-26
      • 1970-01-01
      相关资源
      最近更新 更多