2012-08-23 210 views
1

爲什麼數據上的第一個http請求太慢?android httpurlconnection數據連接速度慢

我在下面幾行中使用了一些東西:在一行中做一個3個HTTP請求(一個接一個),然後等待一個給定的時間,然後再循環做3個HTTP請求。

我正在使用keep-alive,它基本上也正常工作,但在第一個HTTP請求上,每次我從3 HTTP請求開始時都會有2秒的懲罰。只有第一個HTTP請求有這2秒的懲罰。如果我將連續HTTP請求之間的等待時間降低到200毫秒,所有請求都很快,而沒有第一個請求看到這2秒的懲罰。

顯然這聽起來像第一個請求可能不使用保持連接,但事實並非如此。我在服務器上運行tcpdump,並且可以清楚地看到所有請求都使用相同的TCP連接而不關閉,並再次建立新的連接。服務器上的保持活動狀態設置爲60秒,而等待應用程序的時間爲5秒。另外,當我切換到WIFI這種行爲,我看不到。與此同時等待所有請求都很快。

在HTTP連接的代碼是使用HttpURLConnection類和如下所示:

m_res.error = null; 
HttpURLConnection connection; 
try { 
    connection = (HttpURLConnection)(new URL(m_url + "/" + m_call.command).openConnection()); 
    connection.setDoOutput(true); // triggers POST. 
    connection.setDoInput(true); 
    connection.setRequestProperty("Accept-Charset", m_charset); 
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + m_charset); 
    connection.setRequestProperty("Connection", "Keep-Alive"); 
    connection.setRequestProperty("Accept-Encoding", "gzip"); 
    //connection.setChunkedStreamingMode(0); 
    OutputStream output = null; 

    try { 
     output = connection.getOutputStream(); 
     output.write(m_call.query_string.getBytes(m_charset)); 
     InputStream response = null; 
     try { 
      response = connection.getInputStream(); 
      if ("gzip".equals(connection.getContentEncoding())) { 
       response = new GZIPInputStream(response); 
      } 
     } 
     catch (IOException e) { 
      response = connection.getErrorStream(); 
     } 
     if (response == null) { 
      m_res.error = "Connection Error"; 
     } 
     else { 
      m_res.body = getAsString(response); 
      m_res.status = connection.getResponseCode(); 
     } 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
     m_res.error = "Connection Error"; 
    } 
    finally { 
     if (output != null) 
       try { 
        output.close(); 
       } catch (IOException logOrIgnore) {} 
     } 
    } 
} 
+0

和您的問題是... –

+0

爲什麼數據連接上的第一個http請求如此緩慢? – domcyrus

回答

0

我認爲一個可能的答案,這是下面一個IP層上的設備的數據連接被改變其狀態例如可能存在某種待機狀態,例如當給定時間沒有輸入或輸出數據時,這些待機狀態將會起作用,例如,就像我例子中的5秒。

+0

這確實是手機的工作原理:閒置時,電源切換到待機狀態,連接時間稍長。如果它保持空閒狀態的時間更長,那麼它們會關閉收音機,並且需要更長的時間。 –

+0

這是有記錄的地方嗎? – domcyrus

+0

這裏你去:http://blog.radioactiveyak.com/2012/03/understanding-mobile-radio-state-to.html –

0

查看ARO工具,可以查看網絡級別正在發生的情況。 https://developer.att.com/developer/aro 分析儀將向您顯示正在發生的所有不同網絡通信,並幫助您更有效地使用網絡。 我在我的評論中發佈的其他鏈接解釋了狀態機以及空閒時不同時間的連接情況。

+0

您的鏈接是破碎 – anivaler