2011-03-01 629 views
4

我在Android应用程序中使用Apache DefaultHttpClient向Web服务器发出获取请求(URL无关紧要,现象出现在不同的服务器/网站上)。使用HTC Desire与3G网络的第一次请求需要几秒钟(> 4秒),接下来的时间大概只有0.5秒。如果我在进行下一个请求之前等待超过15秒,则下一个请求再次需要几秒钟。 请求使用HTTP1.1,服务器时间不是问题。 DNS查找也不是问题,因为我也尝试使用IP。Http请求第一次慢,等待时间太长

对我来说,它看起来像是在Apache框架中的一些连接超时设置,或者是我的HTC设备将网络接口置于睡眠状态(如果这样做的话)。

编码是非常简单的,它看起来像这样:

HttpGet get = new HttpGet(uri); 
long startTimeMillisRequest = System.currentTimeMillis(); 
HttpResponse response = client.execute(get); 
long endTimeMillisRequest = System.currentTimeMillis(); 

没有人有原因的线索或遇到同样的事情吗? 我已经把它放到一个AsyncTask中,但我仍然想知道为什么它这么慢。

感谢, 马丁

+1

您可以使用tcpdump捕获数据包并验证数据包的发送和接收时间戳,以查看从服务器获取响应所需的确切时间,而不是使用System.currentTimeMillis()来测量开始和结束时间。 – 2011-03-01 12:27:59

回答

2

有几个选项在这里:

  • 保活:这可能是它的价格昂贵,以设置初始TCP连接,然后再使用后续的HTTP TCP连接要求。这就解释了tcp连接在〜10-15秒之后被丢弃,迫使你重新启动它们。

  • DNS缓存过期 - 很不可能,因为我们谈论的是秒而不是分钟。

最好的办法是设置tcpdump和捕获数据包。您可以通过捕获服务器上的入站数据包并查看tcp流来完成此操作。

+0

关于keepalives:有什么方法可以在客户端上设置keepalive值来重用连接吗?我尝试使用我自己的HttpClient并覆盖以下方法:setKeepAliveStrategy(),setReuseStrategy()。不知何故,这并没有产生更好的结果。 – hoffimar 2011-03-01 12:34:50

+2

这是在服务器端建立的。所以假设你有权访问服务器,你可能想打开keepalives并增加超时来测试这个理论。请参阅http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout – Lmwangi 2011-03-01 13:02:05