2012-08-23 169 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