android - Android上的HttpClient : NoHttpResponseException root cause In my project,是吧?

标签 android httpclient

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

我引用了这篇文章 a link , 和

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

不适合我。

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

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

不知道是不是android的bug(我用的是android 2.3测试),有大神知道吗?提前致谢。

最佳答案

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

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


此外,请检查您的连接参数设置。根据 apache 文档(请参阅 http://hc.apache.org/httpclient-3.x/performance.html),建议打开 UseExpectContinue 以提高性能。如果您使用的是 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);

关于android - Android上的HttpClient : NoHttpResponseException root cause In my project,是吧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472136/

相关文章:

android - scrollview 在 android 中滚动到中间

java - 将数据从 Android Activity 发送到 Web 表单

angular - 在 Angular 项目中将 Http 迁移到 HttpClient

java - AlarmManager.ELAPSED_REALTIME_WAKEUP 在 android 中究竟做了什么

java - 如何制作可以更改 Android 用户界面字体的应用程序?

android - 如何在 React Navigation 中添加抽屉内部堆栈导航

android - Android StackView 是什么样子的?

.net - HttpClient - .net 4 或 .net 4.5

java - 如何使用 java 登录 JSF 页面

c# - 在 C# 上发送带有内容类型应用程序 Json 的 post Https 请求