微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我参考了这篇文章a link,并且

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

不适合我.

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

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

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

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐