2010-01-05 26 views
7

我的聊天應用程序連接到服務器,用戶發送/接收信息。當連接發生變化時,例如3g-> wifi,wifi-> 3g,丟失數據連接等,socket有時會在斷開連接之前保持連接狀態。在此期間,無法判斷連接是否仍處於活動狀態,看起來好像郵件發送得很好。其他時候,發送消息時,它會拋出IO錯誤並斷開連接。連接變化時套接字不斷開

除了實現代碼來檢測連接更改並重新適當地重新連接之外,是否有可能在連接更改時立即拋出IO異常?

編輯:

Socket sock = new Socket(); 
sock.connect(new InetSocketAddress(getAddress(), getPort())), getTimeout()); 
//get bufferedReader and read until BufferedReader#readLine() returns null 
我不使用setSoTimeout作爲數據可以不被移送根據遠程服務器的配置的長時間

:我使用以下代碼連接。

+0

然後看到http://stackoverflow.com/questions/969866/java-detect-lost-connection http://stackoverflow.com /問題/ 155243 /爲什麼 - 是 - 它不可能的 - 不 - 嘗試-IO到檢測 - 這-TCP-插座爲寬限期 – 2010-01-05 23:23:36

回答

0

這是一個老問題,我曾在數據庫世界中看過幾次。

我在那裏使用的解決方案是在應用程序級別管理連接。我明確地通過連接發送某種類型的無操作消息(即SELECT 1 WHERE FALSE),每隔一段時間ping一次,如果失敗,我會拆除並重新建立連接,如果原始連接可能會重新建立連接不接受關係。

0

由於前面的答案已經指出,這是一個常見的問題。即使在發送自定義的「ping」之後,它可能也需要一段時間,直到套接字意識到底層連接中斷。另外,由於它們的尾部狀態,使用3-4G移動網絡的定期ping是相當耗能的。不要這樣做!

但是,您可以做的是requesting to get informed when the connectivity changes (last section),並在相應的廣播接收器中手動關閉/重新連接套接字。 (編輯:我看你已經發現了這個;只是保持在這裏的完整性)