DefaultHttpClient 超时设置为 10 秒,但只需 1 秒即可超时

Posted

技术标签:

【中文标题】DefaultHttpClient 超时设置为 10 秒,但只需 1 秒即可超时【英文标题】:DefaultHttpClient timeout set to 10 seconds but only takes 1 second to timeout 【发布时间】:2012-05-21 00:56:24 【问题描述】:

我有这个静态函数,它基本上与网页建立连接,连同它一起发送帖子数据并返回接收到的响应(JSON 对象)

我遇到的问题是,无论我设置什么超时,当它只尝试 1 秒时,它通常会给出超时,而超时是 6 秒,这是不应该发生的。

public static String makeRequest(String path, String info) throws Exception 

  HttpParams httpParameters = new BasicHttpParams();
  int timeoutConnection = 6000;
  HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
  int timeoutSocket = 6000;
  HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

  DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);
  HttpPost httpost = new HttpPost(path);
  StringEntity jsonobj = new StringEntity(info);
  httpost.setEntity(jsonobj);
  httpost.setHeader("Accept", "application/json");
  httpost.setHeader("Content-type", "application/json");
  ResponseHandler responseHandler = new BasicResponseHandler();

  String response = httpclient.execute(httpost, responseHandler);
  return response;

现在我已经看到了一些类似的问题,但我找不到可以帮助我的答案。 有人说是因为它不是线程安全的,但是,我不会同时进行多个调用,都是按顺序完成的。该问题在第一次尝试时发生,由于这个原因,由于还没有多个连接/httpposts,更不用说来自不同的线程了。

但最近确实经常发生,有时几天都没有发生,或者在那些日子里几乎没有发生。

我尝试查看androidHttpClient,但它似乎不支持HttpPost,所以这也没有用(或者我错了?)

path 和 info 的数据都是正确的,测试过了。我的服务器也没有问题。

有人说它可以是你的网络,但我今天测试了 3 个 wifi 网络。奇怪的是,在我的移动提供商的互联网连接上,它没有或几乎没有发生。

我在一个答案中读到这可能是因为 ISP 更改了标头信息。我尝试为用户代理使用不同的值,但这也不起作用。

我希望有人能提供帮助,对此我将不胜感激,因为这种情况不断发生让我非常沮丧。

【问题讨论】:

【参考方案1】:

如果 TCP 在超时期限之前检测到连接拒绝(即传入的 RST),则表示失败。在这种情况下等待超时是没有意义的,并且可以预期重试只会以同样的方式再次失败。超时是针对没有响应的情况。

【讨论】:

好的,我已经搜索了谷歌(第一次点击次数不多),但据我了解,当由于某种原因无法建立连接时,org.apache.http.conn.ConnectTimeoutException 也会触发.据我了解,第一个是重置连接的 TCP 协议的连接重置位。这很可能是问题所在,但为什么会发生这么多(尤其是 wifi 时),是否有已知的方法来修复它或捕捉并正确处理它?因为我尝试过的重试不起作用,所以它一直在失败。 @Ghotirey RST 是“积极的”失败。连接肯定被拒绝了,要么被主机拒绝,因为端口上没有任何东西在监听,要么被防火墙拒绝,因为它不允许连接。在任何一种情况下,重试都是徒劳的。超时适用于根本没有收到响应的情况,这可能表示丢包或暂时失去连接,因此值得重试。

以上是关于DefaultHttpClient 超时设置为 10 秒,但只需 1 秒即可超时的主要内容,如果未能解决你的问题,请参考以下文章

Android 上 DefaultHttpClient 中连接和套接字超时的默认值是啥?

DefaultHttpClient 到 AndroidHttpClient

DefaultHttpClient使用

DefaultHttpClient 更改响应大小?

Android Wigets 不能使用自定义 DefaultHttpClient

Android:使用 DefaultHttpClient 登录网站并保留会话/cookie