【问题标题】:Why would a "java.net.ConnectException: Connection timed out" exception occur when URL is up?为什么 URL 启动时会出现“java.net.ConnectException:连接超时”异常?
【发布时间】:2010-09-10 08:26:50
【问题描述】:

我从我的代码中获得了一些频率的ConnectException: Connection timed out。我要访问的 URL 已启动。相同的代码适用于某些用户,但不适用于其他用户。似乎一旦一个用户开始得到这个异常,他们就会继续得到这个异常。

这是堆栈跟踪:

java.net.ConnectException: Connection timed out
Caused by: java.net.ConnectException: Connection timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.Socket.connect(Socket.java:516)
    at java.net.Socket.connect(Socket.java:466)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
    at sun.net.www.http.HttpClient.New(HttpClient.java:287)
    at sun.net.www.http.HttpClient.New(HttpClient.java:299)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840)

这是我的代码中的一个 sn-p:

URLConnection urlConnection = null;
OutputStream outputStream = null;
OutputStreamWriter outputStreamWriter = null;
InputStream inputStream = null;

try {
    URL url = new URL(urlBase);
    urlConnection = url.openConnection();
    urlConnection.setDoOutput(true);

    outputStream = urlConnection.getOutputStream(); // exception occurs on this line
    outputStreamWriter = new OutputStreamWriter(outputStream);
    outputStreamWriter.write(urlString);
    outputStreamWriter.flush();
    inputStream = urlConnection.getInputStream();
    String response = IOUtils.toString(inputStream);
    return processResponse(urlString, urlBase, response);
} catch (IOException e) {
    throw new Exception("Error querying url: " + urlString, e);
} finally {
    IoUtil.close(inputStream);
    IoUtil.close(outputStreamWriter);
    IoUtil.close(outputStream);
}

【问题讨论】:

  • 如果您的问题已解决,请将其中一个答案标记为已接受 :)

标签: java connection urlconnection connectexception


【解决方案1】:

您的 IP/主机有可能被远程主机阻止,尤其是当它认为您打得太猛时。

【讨论】:

    【解决方案2】:

    连接超时(假设一个本地网络和多台客户端计算机)通常是由

    引起的

    b) 网络配置错误或线路过载导致丢包

    c) 过多的请求使服务器过载

    d) 服务器上同时存在少量可用线程/进程,导致所有线程/进程都被占用。这种情况尤其发生在需要很长时间才能运行并可能与 c) 结合的请求中。

    希望这会有所帮助。

    【讨论】:

    • 帮助我调试此问题的是 ping 我发出请求的服务器。我发现 URL 解析为公共 IP,而不是我想要的私有 IP。 /etc/hosts 文件中的新映射允许解决此问题。我添加评论以防其他人遇到类似问题。
    【解决方案3】:

    如果 URL 在同一台计算机上的 Web 浏览器中运行良好,则可能是 Java 代码未使用浏览器用于连接 URL 的 HTTP 代理。

    【讨论】:

    【解决方案4】:

    我建议在获取输出流之前提高连接超时时间,如下所示:

    urlConnection.setConnectTimeout(1000);
    

    其中 1000 以毫秒为单位(1000 毫秒 = 1 秒)。

    【讨论】:

    • 这不是提高它,而是大幅降低它。默认是一分钟左右,你不能增加,只能降低。
    【解决方案5】:
    • 尝试执行 Telnet 以查看任何防火墙问题
    • 执行tracert/traceroute 查找跳数

    【讨论】:

    • traceroute 到哪里?
    • 很明显,无论您遇到错误的 ip 是什么。
    【解决方案6】:

    这可能是 IPv6 问题(主机发布了 IPv6 AAAA-Address 并且用户主机认为它是为 IPv6 配置的,但实际上连接不正确)。这也可能是网络 MTU 问题、防火墙阻塞,或者目标主机可能发布了不同的 IP 地址(随机或基于发起者国家/地区),这些地址并非都可以访问。或者类似的网络问题。

    除了设置超时和添加好的错误消息(尤其是打印出主机的解析地址)之外,您无能为力。如果您想让它更健壮,请添加重试、并行尝试所有地址,并查看 Java 平台上的名称解析缓存(正面和负面)。

    【讨论】:

      【解决方案7】:

      这发生在我身上的原因是远程服务器只允许某些 IP 地址而不是它自己的地址,并且我试图从服务器的 URL 呈现图像......所以一切都会停止,显示超时您遇到的错误...

      确保服务器允许其自己的 IP,或者您正在从实际存在的某个远程 URL 呈现内容。

      【讨论】:

        【解决方案8】:

        错误消息说明了一切:您的连接超时。这意味着您的请求在某些(默认)时间范围内没有得到响应。未收到回复的原因可能是以下之一:

        a) IP/域或端口不正确

        b) IP/域或端口(即服务)已关闭

        c) IP/域的响应时间超过您的默认超时时间

        d) 您有防火墙阻止您使用的任何端口上的请求或响应

        e) 您的防火墙阻止了对该特定主机的请求

        f) 您的互联网访问已关闭

        g) 您的实时服务器已关闭,即在“rest-API 调用”的情况下。

        请注意,您的 ISP 可能会设置防火墙和端口或 IP 阻止

        【讨论】:

          【解决方案9】:

          我解决了我的问题:

          System.setProperty("https.proxyHost", "myProxy");
          System.setProperty("https.proxyPort", "80");
          

          http.proxyHost...

          【讨论】:

            【解决方案10】:

            为什么会出现“java.net.ConnectException:连接超时” URL 启动时出现异常?

            因为 URLConnection (HttpURLConnection/HttpsURLConnection) 不稳定。您可以阅读此herehere。 我们的解决方案有两点:

            a) 通过setFixedLengthStreamingMode设置ContentLength

            b) 捕获任何 TimeoutException 并在失败时重试。

            【讨论】:

              猜你喜欢
              • 2016-09-25
              • 1970-01-01
              • 2020-06-29
              • 2011-08-05
              • 2019-09-09
              • 1970-01-01
              • 2014-03-01
              • 2018-11-12
              • 2015-09-27
              相关资源
              最近更新 更多