2012-12-08 62 views
2

我有一個有趣的問題。已建立連接但沒有互聯網的UnknownHostException超時

我有一個應用程序,其中,我試圖說明手機連接到路由器,但該路由器沒有連接到互聯網的情況。

我已經嘗試了建立連接的多種方法,但沒有超時的帳戶爲這種情況。

我已經試過:

HttpParams httpParameters = new BasicHttpParams(); 
int timeoutSocket = 1000; 
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutSocket); 

我也試過:

HttpURLConnection huc = (HttpURLConnection)serverAddress.openConnection(); 

huc.setDoOutput(true); 
huc.setRequestMethod("PUT"); // For amazon 
//huc.setRequestMethod("POST"); // For regular server. 
huc.setRequestProperty("Content-Type", "text/plain"); 
huc.setRequestProperty("Content-Length", String.valueOf(bytes)); 
huc.setFixedLengthStreamingMode(bytes); 
huc.setConnectTimeout(1000); // Establishing connection timeout 
huc.setReadTimeout(1000); 

但在這兩種情況下,當我執行/獲取輸出流,它需要大約20秒接收一個UnknownHostException錯誤。

我希望在達到這個結論之前減少到最多5秒。

有沒有辦法做到這一點?

乾杯

回答

2

通過大量的搜索,並通過this鏈接的幫助下,我發現,接縫可正常工作的固溶至今。

我的結論的理解是,當我使用類似的方法:

DataOutputStream wr = new DataOutputStream(huc.getOutputStream()); 

InputStream is = ucon.getInputStream(); 
BufferedInputStream bis = new BufferedInputStream(is); 

(上傳或下載)

有下發生了很多事情引擎蓋。包括DNS查詢呼叫。在沒有連接的情況下,當連接到路由器時,這需要大約20秒鐘才能最終到達UnknownHostException。

但是,如果我第一次上面的代碼之前添加這行代碼被執行:

InetAddress iAddr = InetAddress.getByName("myserverName.com"); 

然後它會給我正確的SocketTimeOutException並響應到底我會希望/期望它。上面的代碼行顯然緩存了DNS查找,超時按預期工作。

此外,需要注意的是:一旦失敗被緩存,執行上面的代碼將會花費與前面其他代碼一樣長的時間。 (不能確切地告訴你什麼會觸發這個)但是如果你再次連接到互聯網,然後再次進入連接但沒有連接狀態,先前的成功將被緩存,並且超時將再次正常工作。

這不是特別容易找到或找出,所以我希望這可以幫助別人。

乾杯,

+0

您能否告訴我應該在哪裏放置這段代碼,與UrlConnection相關? –

+0

你應該能夠把它放在URLConnection之前,即: URL address = new URL(「Your URL」); InetAddress inetAddress = InetAddress.getByName(address.getHost()); URLConnection urlConnection = address.openConnection(); – Dave

0

你可以實現具有5000毫秒的極限CountDownTimer看到這個http://dewful.com/?p=3

+0

嗨brux,不幸的是這種解決方案不適用於我的實施。我需要編寫一堆額外的代碼來管理我的其他同步操作。我發現了一個簡單的解決方案,不需要複雜的代碼,並且接縫的工作效率非常高。儘管我很欣賞你的回答。乾杯。 – Dave