2013-02-24 74 views
0

的損失我有一個客戶端,並在Java服務器程序。服務器通過wifi向客戶端發送數據。在客戶端斷開wifi連接會導致它拋出異常並退出接收循環。服務器仍然繼續發送數據。服務器使用的方法是oos.writeObject()。如何檢測服務器端客戶端的無線網絡斷開並導致服務器退出發送循環?檢測連接

+0

TCP或UDP或其他協議? – Celada 2013-02-24 16:53:01

+0

使用的協議是TCP。 – user1761399 2013-02-25 03:16:06

回答

0

之所以你的客戶端(在某些類型的WiFi連接的故障模式),當連接消失馬上注意到是因爲WiFi接口是本地客戶機和操作系統,只要它是眼淚下來檢測爲關閉。從服務器的角度來看,這是一個遙遠的網絡鏈接失敗。

當連接出現故障,在第一服務器將繼續緩衝數據。如果緩衝區(服務器的操作系統緩衝區加上TCP窗口大小)變滿,則服務器將嘗試發送更多數據時阻塞。

以後,如果連接仍然向下,服務器將宣佈該連接超時,你會得到一個異常。如果連接恢復,則緩衝區將清空並恢復正常的數據流。

即使你能,你實際上並沒有想出來馬上改變的事情,使服務器的連接時候,任何遙遠的網絡跳失敗。如果你這樣做了,你的連接就會非常脆弱:每一次小的網絡重新聚合事件或短暫的短暫故障都會破壞你的連接。

+0

非常感謝您的解釋。我只需要知道是否有一些方法類似於setSoTimeout()進行讀取,可以在此使用,以便在固定持續時間後至少關閉連接。 – user1761399 2013-02-26 03:28:51

+0

肯定的是:你可以使用的信號,或取消在做文字線程,或者使用非阻塞I/O和插座後放棄還沒來供所需的時間量之後寫,等... – Celada 2013-02-26 14:33:24

+0

燦你直接指向一些使用非阻塞I/O或信號放棄寫入的鏈接。我們如何檢測到套接字不可用於寫入? – user1761399 2013-03-16 16:03:47