2011-03-01 102 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