2014-10-03 128 views
2

我與Android 4.1.2和4.2.2存在間歇性連接問題,HTTP堆棧似乎完全超時(DNS查找和TCP/IP仍然有效,我可以檢查使用ADB SHELL )。Android HttpURLConnection連接超時

這些連接正在通過GPRS進行故障切換,而不是通過WiFi。

當使用SHELL檢查netstat時,我可以看到連接正在等待SYN_SENT,當檢查服務器上的防火牆時,我們可以看到它已響應SYN請求,但沒有收到任何設備。在此停電期間,似乎所有HTTP流量都在設備上失敗。即使設備報告了網絡,並且您可以撥打/接聽電話,Exchange也不能再使用任何常用瀏覽器(Firefox,Chrome)請求任何頁面。

我的應用程序通過HTTP和HTTPS進行通信,並且在停電期間都會失敗。 POST和GET我的JSON Web服務請求掛起,並拋出:

java.net.SocketTimeoutException: failed to connect to mywebaddress.com/1.1.1.1 (port 443) after 10000ms 

如果它有連接,因爲它是尊重我與HttpURLConnection的下方設置超時麻煩這是預期。

我使用的代碼如下,位於一個Async類中。這通常包含在連接循環中,具體取決於消息的重要性。這可能會被調用3次,每次通話間隔15秒。

HttpURLConnection conn = null; 
BufferedReader reader = null; 

try 
{   
    // Uses ConnectivityManager.getActiveNetworkInfo() 
    // Returns true, the Android OS reports a connection 
    if(myApp.hasNetworkConnection) 
    { 
     conn = (HttpURLConnection)endpoint.openConnection(); 
     conn.setConnectTimeout(10000); 
     conn.setReadTimeout(20000); 

     reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     StringBuffer strResults = new StringBuffer(); 
     String strLine = ""; 

     while ((strLine = reader.readLine()) != null) 
     { 
      strResults.append(strLine); 
     } 

     log(strResults.toString()); 
    } 

} 
catch(Exception ex) 
{ 
    log(ex.getMessage()); 
} 
finally 
{ 
    if(reader != null) 
     try 
     { 
      reader.Close(); 
      reader = null; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 

    if(connection != null) 
    { 
     connection.disconnect(); 
     connection = null; 
    } 
} 

我不知道是否有人已經經歷過這個在過去是定期嘗試連接錯誤的做法和排氣連接池的方法是什麼?

創建的連接會定期激活,並且不會(當前)批量連接在一起。

只是爲了分享一些信息,當我們遇到停電時,這是netstat在設備(ADB Shell)上顯示的內容。兩個「ESTABLISHED」連接是不是HTTP請求的TCP連接。手機有信號,數據符號顯示連接。

SYN_SENT

回答

0

只是想我會更新,套內這個問題是由其他人遇到。

這裏的問題不在於Android,而在於應用程序調用的Web服務。看着它,它在調用JSON Web服務時,返回一個響應(如果有的話)花費的時間比預期的多(最多一分鐘),並且響應始終爲200/OK。當我們使Android HTTP堆棧滿足請求時,最終它們沒有在足夠好的時間內清除並凍結設備。

我通過將連接和讀取超時值設置爲更適當的值而不是「0」(無限)來增加我的代碼的容錯能力,並且我們考慮修改Web服務,以便長時間運行的進程返回201 /接受狀態,以便設備可以繼續進行自己的工作。一旦服務器處理完成,我們會通過其他方式(Google Cloud Message)將設備撥回。

0
try this 

    try { 
    HttpURLConnection.setFollowRedirects(false); 
    HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); 
    con.setRequestMethod("HEAD"); 

    con.setConnectTimeout(5000); //set timeout to 5 seconds 

    return (con.getResponseCode() == HttpURLConnection.HTTP_OK); 
} catch (java.net.SocketTimeoutException e) { 
    return false; 
} catch (java.io.IOException e) { 
    return false; 
} 
+0

如果您不介意,添加setFollowRedirects的目的是什麼?從目前的響應來看,服務器無處不在重定向。 此外,setRequestMethod將只返回狀態碼。效率更高但是還有其他原因嗎? – 2014-10-03 11:43:11