2013-04-29 50 views
0

我正在開發一個Android應用程序,需要通過TCP套接字連接發送消息。我已根據connect(SocketAddress endpoint, int timeout)方法設置超時值。現在,connect()方法會阻塞,直到超時過期,並且僅當服務器處於脫機狀態時纔會拋出SocketException。在網絡禁用,網絡不可達等所有其他情況下,超時值將被忽略,該方法直接拋出SocketException (ENETUNREACH)。即使在這種情況下,我如何確保超時工作?如果需要將提供額外的信息。connect()方法忽略超時值

感謝

+0

當GPRS仍在準備連接 – autopilot 2013-04-29 07:05:10

回答

4

連接超時是當你沒有從遠程服務器響應的情況。在其他情況下,超時不適用;例如

當連接成功
  • 當遠程服務器拒絕連接,
  • 當網絡層說「沒有路線主辦」
  • 當網絡層說
  • 「沒有路由網絡」 /「網絡不可達」。

在這些情況下,連接嘗試立即成功或失敗。如果您想繼續嘗試,則需要將連接調用包裝在某些代碼中,以便在發生可重試故障時重試。 (編寫代碼以決定重試次數以及何時停止,以免浪費網絡資源,電池電量等等由您決定)

+0

+1時,正在丟棄網絡不可達。您應該進一步注意,超時參數只能用於減少平臺超時,而不是增加平臺超時,並且默認不是無窮大,與Javadoc相反。 – EJP 2013-04-29 08:37:28

0

這就是該方法的預期行爲。超時只有在建立連接需要時間時纔有意義。如果確定由於其他原因無法建立連接,則會立即拋出錯誤,而不會浪費時間。這就是該方法在內部實施的方式。