2010-06-02 53 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分鐘準備停機維護」等)