为什么会在URL启动时发生“java.net.ConnectException:Connection超时”exception?

我得到一个ConnectException: Connection timed out我的代码的一些频率。 我正在尝试打开的url已closures。 相同的代码适用于某些用户,但不适用于其他用户。 似乎有一次用户开始得到这个exception,他们继续得到exception。

这是堆栈跟踪:

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

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

a)某种types的防火墙只是简单地吃包而不告诉发件人诸如“无路由到主机”

b)由于错误的networkingconfiguration或线路过载造成的数据包丢失

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

d)服务器上的less量同时可用的线程/进程导致它们全部被占用。 特别是对于需要花费很长时间才能运行的请求,可能会与c)结合使用。

希望这可以帮助。

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

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

 urlConnection.setConnectTimeout(1000); 

1000是毫秒(1000毫秒= 1秒)。

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

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

a)IP /域或端口不正确

b)IP /域或端口(即服务)closures

c)IP /域比默认的超时时间要长

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

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

f)您的互联网访问停止

g)您的实时服务器停机,即“rest-API调用”。

请注意,防火墙和端口或IP阻断可能由您的ISP提供

这可能是IPv6问题(主机发布IPv6 AAAA地址,用户主机认为它configuration了IPv6,但实际上没有正确连接)。 这也可能是networkingMTU问题,防火墙阻止,或者目标主机可能会发布不同的IP地址(随机地或基于发起者国家),这些地址不是全部可达的。 或similliarnetworking问题。

除了设置超时和添加好的错误消息(特别是打印出主机的parsing地址)之外,你不能做太多的事情。 如果您希望使其更加健壮,请添加重试,并行尝试所有地址,并在Java平台上查看名称parsingcaching(正面和负面)。

有可能您的IP /主机被远程主机阻塞,特别是如果它认为你太难了。

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

确保服务器允许自己的IP地址,或者从某个实际存在的远程URL中渲染东西。