为什么URLConnection会在6分钟而不是5秒后超时?

我从我的应用程序中逐字逐句拷贝了这个方法,这个方法还没有完成,但是如果事情不顺利的话,它会试图为我提供一个超时栈跟踪:

protected boolean isHttpAlive()  {
  boolean isHttpOk = false;

  HttpURLConnection httpConnection = null;
  try {
    URL gurl = new URL("http://www.amazon.com/");
    URLConnection connection = gurl.openConnection();
    connection.setConnectTimeout(5 * 1000); // 5 seconds!
    httpConnection = (HttpURLConnection) connection;
    int responseCode = httpConnection.getResponseCode();
    if (responseCode == HttpURLConnection.HTTP_OK)
      isHttpOk = true;
  } 
  catch (Exception e) {                    
    e.printStackTrace();
  }
  finally {
    if (httpConnection != null)
      httpConnection.disconnect();
  }

  return isHttpOk;
}

现在在我的一个测试设备(Droid)上,当出现问题时,我确实得到了异常,但是只有6分36秒 ,而不是5秒,正如我在上面的代码中设置的那样。

getResponseCode()引发超时异常。

为什么?

我错过了什么?


我最好的猜测是,你连接的URL,在这种情况下,亚马逊有多个IP地址。

根据文档中的警告:

如果主机名解析为多个IP地址,则此客户端将按RFC 3484顺序尝试每个IP地址。 如果连接到这些地址中的每一个都失败, 那么在连接尝试引发异常之前将会经过多次超时。 支持IPv6和IPv4的主机名至少有2个IP地址。


编辑:
我仍在研究这个,因为我想将我的应用程序从HTTPClient转换为URLConnection 。 在你的情况下,我不满意6分钟超时。

我也偶然发现了这个博客。 他建议添加connection.setReadTimeout(READ_TIMEOUT_MILLISECONDS); 同样,不知道这是否会帮助你的情况。


这个代码之王对于测试连接并不是非常有用。 连接不好的原因很多(ip堆栈的每一层都可能有问题)。 一个例子:你可以有一个连接,每秒接收一个字节,没有超时但对用户来说不是很有趣......如果你使用“www.amazon.com”作为测试,他们可以给你玩一个玩笑(我'ld自己做; D)

链接地址: http://www.djcxy.com/p/61825.html

上一篇: Why would URLConnection timeout after 6+ minutes instead of 5 seconds?

下一篇: How to draw a specific CGPath with unordered CGPoints