6+分钟而不是5秒后为什么会URLConnection的超时?(Why would URLConne

2019-06-26 10:19发布

我从我的应用程序,这是尚未完成,逐字复制这种方法,但它并试图向我提供一个超时的堆栈跟踪,如果事情不顺利:

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()

为什么?

我在想什么?

Answer 1:

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

按中相应的警告文档 :

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


编辑:
我仍然在研究这个,因为我想我的应用程序将从HTTPClientURLConnection 。 我很不满意,在你的情况下,一个6+分钟超时。

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



Answer 2:

这位国王的代码是不是非常有用的测试连接。 用于连接不好原因很多(IP堆栈的每一层可以有问题)。 举个例子:你可以有一个连接,并接收用户每秒一个字节,没有超时,但不是很好玩...如果你用“www.amazon.com”的测试,他们可以发挥一个笑话给你(我“LD做我自己; d)



文章来源: Why would URLConnection timeout after 6+ minutes instead of 5 seconds?