2017-03-05 69 views
2

我有經典的http客戶端/服務器應用程序,服務器在服務器端按照自己的意願提供客戶端數據,但是也對客戶端地址列表執行某種回調。我的兩個問題是:服務器如何檢查客戶端的可用性?

1-服務器如何知道客戶端是否關閉(客戶端沒有斷開,但連接突然中斷)?

2-有沒有辦法從服務器端知道客戶端在回調端口上偵聽的進程是否仍然運行(即客戶端回調套接字仍然打開)?

+0

與websockets雙方可以相互ping/pong,而不需要客戶端到服務器 –

+0

@亨寧路德:謝謝 –

回答

1

1-服務器如何知道客戶端是否關閉(客戶端沒有斷開,但連接突然中斷)?

  • 選項#1:直接通信

    客戶端告訴服務器 「我還活着」 在週期性間隔。您可以讓您的客戶端以可配置的時間間隔服務於您的服務器,並且如果服務器在某段時間內未收到信號,則會將客戶端標記爲關閉。客戶甚至可以在每個心跳中告訴服務器更多的信息(例如狀態),這也是許多分佈式系統(例如Hadoop/Hbase)中使用的方式。

  • 選項#2:分佈式協調服務

    你可以把連接到一臺服務器作爲一組所有客戶端,並且使用第三方分佈式協調服務像動物園管理員以方便會員管理。客戶在啓動後立即註冊爲Zookeeper作爲該組的新成員,並在組停止後離開組。 Zookeeper每當成員資格發生變化時都會通知服務器。

2 - 有沒有辦法從服務器端知道,如果在客戶端監聽回撥端口的進程仍上漲(即客戶端回調插座仍處於打開狀態) ?

  • 我認爲這隻能通過上面列出的方式Option #1來完成。這可能是客戶端以固定的時間間隔告訴服務器「我的回調端口正常」的方式,或者服務器詢問客戶端「您的回調端口是否正常?」並等待其在一個固定的時間間隔
+0

非常感謝您的澄清。 –

+0

@ User_X220不客氣:-) – shizhz

0

你將不得不建立某種協議;並簡單地說:服務器跟蹤它試圖發送給客戶端的「消息」。

如果該「發送」被確認,罰款;如果不是,那麼服務器可能會執行有限次數的重試;然後將該客戶視爲「不在」;然後刪除該客戶端的任何其他消息。

+0

謝謝你的回答。 –

+0

非常歡迎。在我的簡要總結上你有一些很好的答案:-) – GhostCat

0

1-服務器如何知道客戶是向下響應(客戶端沒有斷開,但得到的連接突然中斷)?

寫入客戶端將失敗。

2 - 有沒有辦法從服務器端知道,如果在客戶端監聽回撥端口的進程仍上漲(即客戶端回調插座仍處於打開狀態

到客戶端的寫操作將失敗。

寫不一定會立即失敗,由於TCP緩衝,但寫入最終會引發重試和重試超時,這將導致隨後的讀取或寫入失敗。

在Java中失敗將表現爲IOException: connection reset

+0

謝謝您的回覆。 –

相關問題