我使用DefaultHttpClient从服务器获取数据,但偶尔会发生NoHttpResponseException。
我参考了这篇文章a link和
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);
对我不起作用。
我使用 HttpRequestRetryHandler 来避免这个问题,并且它可以工作,但我不认为这是一个完美的方法,因为 tcpdump 转储了网络数据包服务器端。
我发现当发生NoHttpResponseException时,在连接到服务器而不是在此请求之前使用的旧端口时使用新端口(HttpClient不重用旧连接)。但是当从客户端连接到服务器端的新端口时,我没有找到任何tcp 3次握手数据包。但是基于tcp理论,握手是建立新连接时必须采取的步骤。
我不知道它是否是android的错误(我正在使用android 2.3进行测试),有没有人有想法?提前谢谢。
答案 0 :(得分:1)
我建议你查看你的HttpClient版本,即使它使用得更广泛,Android上的HttpClient也不是由android团队维护的。您可能正在运行旧版本。以下是步骤:
另外,请检查连接参数设置。建议根据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);