HttpURLConnection超时似乎被忽略了

时间:2017-07-24 12:28:17

标签: java android httpurlconnection

我正在尝试使用HttpURLConnection正确配置连接的超时。

我的问题是在getResponseCode()调用之后它总是在60秒后超时而不是我设置的值。我的代码:

    URL url = new URL(uri.toString());
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setConnectTimeout(15000);
    connection.setReadTimeout(15000);
    int responseCode = connection.getResponseCode();

我缺少什么?

1 个答案:

答案 0 :(得分:1)

几天前我也遇到了同样的问题,所以做了一些研究。

  

我的问题是在getResponseCode()调用之后它总是在60秒后超时而不是我设置的值。

这是因为InetAddress.getByName(String)执行DNS查找。该查找不是连接的一部分 超时。

JDK不允许您在此处指定超时。它只是使用底层的超时 名称解析机制。

无论如何,我怀疑效果不仅限于Java。你应该能够观察到同样的事情 使用nslookup或来自终端的host命令超时。在"正常"环境DNS 查找超时应为1-3秒,但不是20秒。所以我强烈怀疑 您的网络设置已损坏。

有几件事可能导致这种疯狂的超时:

  • DNS服务器无法访问(UDP端口53),但ICMP已过滤,因此客户端无法快速失败
  • DNS服务器上的本地防火墙在已关闭的TCP端口上丢弃数据包而不是发送RST
  • 阻止ICMP消息的中间防火墙
  • 通过IPv6执行查找,但缺少IPv6连接
  • A记录查找前的AAAA记录查找
  • 您的DNS服务器执行完全递归但没有缓存。客户端应始终查询DNS缓存,而不是仅查询recursor。

解决方法:您可以在发送请求之前执行查找,因此结果已经存在 预缓存。

相关问题