【问题标题】:Why would URLConnection timeout after 6+ minutes instead of 5 seconds?为什么 URLConnection 会在 6 分钟以上而不是 5 秒后超时?
【发布时间】:2012-07-19 21:49:57
【问题描述】:

我正在从我的应用程序中逐字复制此方法,该方法尚未完成,但如果事情进展不顺利,它会尝试为我提供超时堆栈跟踪:

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) 上,当出现问题时,我确实会收到 the exception,但只是在 6 分 36 秒之后,而不是我在上面的代码。

getResponseCode() 抛出超时异常。

为什么?

我错过了什么?

【问题讨论】:

  • 我最好的猜测是,您要连接的 URL(在本例中为 Amazon)有多个 IP 地址。根据文档中的警告“如果主机名解析为多个 IP 地址,则此客户端将按 RFC 3484 顺序尝试每个地址。​​如果连接到这些地址中的每一个失败,则在连接尝试引发异常之前将经过多次超时。主机名同时支持 IPv6 和 IPv4 的总是至少有 2 个 IP 地址。”
  • @Asok 我认为你成功了。请作为答案发布,突出显示在连接尝试引发异常之前会经过多次超时,以便我接受。
  • 我观察到的是超时发生在 60 秒的倍数处,而您的 5 秒可能不起作用。

标签: android httpurlconnection urlconnection android-networking


【解决方案1】:

我最好的猜测是,您要连接的 URL(在本例中为 Amazon)有多个 IP 地址。

根据documentation中的警告:

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


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

我也偶然发现了this blog。他建议也添加connection.setReadTimeout(READ_TIMEOUT_MILLISECONDS);,不知道这是否对您的情况有所帮助。

【讨论】:

  • 我通过设置自己的计时器解决了这个问题,即Handler.postDelayed()
  • 太棒了!以防万一,我可能最终也会这样做。
【解决方案2】:

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

【讨论】:

  • 无论如何,您应该看看 Apple 开发者网站上提供的 Reachability 类。它为您提供帮助消息来管理网络可达性。
猜你喜欢
  • 2013-09-30
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 2015-02-16
  • 2017-05-03
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多