2011-12-12 21 views
4

我使用DefaultHttpClient從服務器獲取數據,但偶爾發生NoHttpResponseException。Android上的HttpClient:NoHttpResponseException根本原因在我的項目中,是不是?

我refered這個帖子a link

HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false); 

不會爲我工作。

我用HttpRequestRetryHandler爲了避免這個問題,和它的作品,但我不認爲這是因爲通過在服務器端tcpdump的甩了網絡數據包的完美方法。

我發現,當發生NoHttpResponseException時,連接到服務器時使用新端口,而不是此請求之前使用的舊端口(HttpClient不重用舊連接)。但是當從客戶端連接到服務器端的新端口時,我沒有找到任何tcp 3-way握手數據包。但基於tcp理論,握手是建立新連接的必要步驟。

我不知道它是否是android的bug(我正在使用android 2.3進行測試),有沒有人有想法?提前致謝。

回答

1

我建議你檢查你的HttpClient版本,即使它使用得更廣泛,android上的HttpClient也不是由android團隊維護的。您可能正在運行較舊的版本。以下是具體步驟:

  1. 確保您獲得最新版本 - http://hc.apache.org/downloads.cgi
  2. 提取httpcomponents-客戶端4.2.1斌到一個方便的目錄在您的工作空間
  3. 創建一個名爲「用戶庫Apache HttpClient 4.2.1'並鏈接到.jar文件中(如果需要,也附上源文檔),並在庫的Order and Export頁面上選擇Export。
  4. 將庫鏈接到您的項目。



另外,檢查你的連接參數設置。建議按照apache文檔啓用UseExpectContinue以獲得性能(請參閱http://hc.apache.org/httpclient-3.x/performance.html)。如果您使用的是HTTP_1_0或更低版本,可能會對您造成問題。

這些設置爲我工作(注意使用HTTP_1_1的,也是你的超時可能會與我的不同):

 HttpParams params = new BasicHttpParams(); 

     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); 
     HttpProtocolParams.setUseExpectContinue(params, true); 

     HttpConnectionParams.setStaleCheckingEnabled(params, false); 
     HttpConnectionParams.setConnectionTimeout(params, 13000); 
     HttpConnectionParams.setSoTimeout(params, 30000); 
     HttpConnectionParams.setSocketBufferSize(params, 8192); 
相關問題