91

I'm getting a ConnectException: Connection timed out with some frequency from my code. The URL I am trying to hit is up. The same code works for some users, but not others. It seems like once one user starts to get this exception they continue to get the exception.

Here is the stack trace:

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)

Here is a snippet from my code:

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);
}
4

10 回答 10

90

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

a) 途中的某种防火墙,它只是简单地吃掉数据包而不告诉发送者诸如“没有到主机的路由”之类的事情

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

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

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

希望这可以帮助。

于 2008-09-17T19:48:33.120 回答
34

如果 URL 在同一台机器上的 Web 浏览器中工作正常,则可能是 Java 代码没有使用浏览器用于连接到 URL 的 HTTP 代理。

于 2008-09-17T20:12:03.343 回答
7

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

a) IP/域或端口不正确

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

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

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

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

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

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

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

于 2017-05-16T06:52:16.273 回答
5

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

urlConnection.setConnectTimeout(1000);

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

于 2008-09-17T20:34:54.380 回答
4
  • 尝试执行 Telnet 以查看任何防火墙问题
  • 执行tracert/traceroute查找跳数
于 2008-11-29T15:20:30.150 回答
3

我解决了我的问题:

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

http.proxyHost...

于 2017-12-01T14:04:00.483 回答
2

为什么 URL 启动时会出现“java.net.ConnectException: Connection timed out”异常?

因为 URLConnection (HttpURLConnection/HttpsURLConnection) 不稳定。您可以在此处此处阅读有关此内容的信息。我们的解决方案是两件事:

a) 通过设置 ContentLengthsetFixedLengthStreamingMode

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

于 2020-04-28T13:59:38.280 回答
1

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

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

于 2014-04-16T03:57:45.297 回答
0

您的 IP/主机有可能被远程主机阻止,特别是如果它认为您对它的打击太大了。

于 2008-09-17T19:45:37.103 回答
0

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

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

于 2016-04-19T18:21:38.827 回答