URL打开时,为什么会发生“ java.net.ConnectException:连接超时”异常?


85

ConnectException: Connection timed out从我的代码中得到了一些频率。我要点击的网址已打开。相同的代码对某些用户有效,但对其他用户无效。似乎一旦一个用户开始获取此异常,他们便会继续获取该异常。

这是堆栈跟踪:

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)

这是我的代码片段:

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

7
如果您已解决问题,请标记一个答案为“正确” :)
Tobias

Answers:


84

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

a)某种防火墙,其方式是简单地吃掉数据包而没有告诉发送方诸如“没有路由到主机”之类的信息

b)由于错误的网络配置或线路过载而导致的数据包丢失

c)太多请求使服务器超载

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

希望这可以帮助。


帮助我调试此问题的原因是对发出请求的服务器执行ping操作。我发现URL解析为公共IP,而不是我想要的私有IP。/ etc / hosts文件中的新映射允许解决此问题。我添加评论是为了防止其他人遇到类似问题。
Bouramas

31

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


6

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

a)IP /域或端口不正确

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

c)IP /域花费的时间超过您的默认超时时间

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

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

f)您的互联网连接中断

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

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


4

我建议增加连接超时时间,然后再获取输出流,如下所示:

urlConnection.setConnectTimeout(1000);

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


21
并不是要提高它,而是要大大降低它。默认情况下大约一分钟,您不能增加它,只能降低它。
2013年

3
  • 尝试执行Telnet以查看任何防火墙问题
  • 执行tracert/traceroute查找跳数

traceroute到哪里?
飞机

显然,无论遇到什么IP,都会遇到错误。
John Lord

2

我用以下方法解决了我的问题:

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

http.proxyHost...


0

您的IP /主机可能被远程主机阻止,特别是如果它认为您太用力了。


0

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

除了设置超时并添加良好的错误消息(尤其是打印出主机的已解析地址)之外,您不能做其他事情。如果要使其更加健壮,请添加重试,对所有地址进行并行尝试,并在Java平台上查看名称解析缓存(正负)。


0

我发生这种情况的原因是,远程服务器只允许寻址某些IP地址,但不允许它自己的IP地址,而我试图从服务器的URL渲染图像...所以一切都会停止,并显示超时错误,有...

确保服务器允许其自己的IP,或者从实际存在的某个远程URL渲染事物。


0

URL打开时,为什么会发生“ java.net.ConnectException:连接超时”异常?

因为URLConnection(HttpURLConnection / HttpsURLConnection)是不稳定的。您可以在这里这里阅读。我们的解决方案有两件事:

a)通过设置ContentLength setFixedLengthStreamingMode

b)捕获任何TimeoutException,如果失败,则重试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.