Android上的HttpClient:NoHttpResponseException根本原因在我的项目中,是不是?

时间:2011-12-12 09:21:01

标签: android httpclient

我使用DefaultHttpClient从服务器获取数据,但偶尔会发生NoHttpResponseException。

我参考了这篇文章a link

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

对我不起作用。

我使用 HttpRequestRetryHandler 来避免这个问题,并且它可以工作,但我不认为这是一个完美的方法,因为 tcpdump 转储了网络数据包服务器端。

我发现当发生NoHttpResponseException时,在连接到服务器而不是在此请求之前使用的旧端口时使用新端口(HttpClient不重用旧连接)。但是当从客户端连接到服务器端的新端口时,我没有找到任何tcp 3次握手数据包。但是基于tcp理论,握手是建立新连接时必须采取的步骤。

我不知道它是否是android的错误(我正在使用android 2.3进行测试),有没有人有想法?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我建议你查看你的HttpClient版本,即使它使用得更广泛,Android上的HttpClient也不是由android团队维护的。您可能正在运行旧版本。以下是步骤:

  1. 确保您获得最新版本 - http://hc.apache.org/downloads.cgi
  2. 将httpcomponents-client-4.2.1-bin解压缩到工作区中的便捷目录
  3. 创建一个名为“Apache HttpClient 4.2.1”的用户库,并链接到.jar文件中(如果愿意,也可以附加源文档),并在库的“订购和导出”页面上选择导出。
  4. 将库链接到您的项目。


  5. 另外,请检查连接参数设置。建议根据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);