2011-11-25 61 views
0

我有用java編寫的服務器 - 客戶端對,如果另一個應用程序退出,我想退出一個應用程序。這是如何完成的? 如果用戶手動退出應用程序(即通過按cmd + q.alt + F4等),我還想知道如何讓程序執行一系列命令(例如關閉套接字等)。Java - Handle程序終止

+4

有很多方法可以做到這一點...... –

+1

當一個人退出時,它會向另一個人發送消息,導致其退出。 –

+0

正如@ @奧格所說的,許多方法都是用它來表示它。只要確保你關閉你的套接字連接,無論你選擇哪種方式來解決它,以防止獲得套接字已綁定的錯誤下次運行你的代碼 –

回答

1

當一個人退出時,它會向另一個人發送消息,導致其退出。

一種方法是在遇到消息時導致接收器關閉的毒丸消息/對象。

1

通常做到這一點的方法是讓心跳線程單獨運行。這種工作方式是 -

  1. 每個客戶端上運行心跳線,並會定期發送信息到服務器實質上說,「我正在運行」。根據您的要求,您可以調整消息之間的時間間隔 。

  2. 服務器運行心跳監聽線程,並保持運行

  3. 一旦所有的客戶端停止發送郵件的服務器可以等待幾分鐘,然後正常關閉客戶端的列表。

這樣的設計可以工作了單個客戶端或多個客戶端。

+0

我需要的,但這裏的問題是,網絡中的任何不可靠,你會「思考」的程序關閉時使用心跳的粉絲。 「網絡連接丟失」與「我退出服務器,我希望客戶端也退出」不一樣。我寧可發送一條消息「我正在下降,所以應該」,以便在使用心跳時打印出「網絡連接丟失」消息,以便正確退出。 – TacticalCoder

+0

@ user988052:那麼如果你擔心網絡中的心跳消息丟失,那麼你如何確定「我要下去,所以你應該」消息將會到達服務器?此外,我們沒有考慮通過UDP發送心跳信號,我們正在使用內置可靠性的TCP套接字。除此之外,您還可以構建冗餘,例如如果超過1分鐘沒有收到心跳,服務器將關閉。這種方法比客戶端更好地告訴服務器我正在關閉,因爲客戶端可能會崩潰,並且可能永遠無法發送消息。 – Pushkar

+0

網絡規則第一:*「網絡不可靠」*。 TCP與否,這被認爲是第一個也是最重要的網絡規則。然後,我*不*談論確保「下去」消息將到達服務器。我說的是服務器關閉時使用正確的消息。當然,如果在發送「正在下降」消息時網絡恰好處於關閉狀態,您可能會錯過一條消息,但以這種方式進行則不會有誤報。這與依靠網絡是可靠的(不是,這是網絡規則第一)是完全不同的。 – TacticalCoder