我从我的代码中得到了某个频率的ConnectException: Connection timed out。我尝试访问的URL已启动。相同的代码对某些用户有效,但对其他用户无效。似乎一旦一个用户开始获取此异常,他们便会继续获取该异常。
这是堆栈跟踪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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) |
这是我的代码中的一个片段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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);
} |
连接超时(假设本地网络和多台客户端计算机)通常是由于
a)某种防火墙,其方式是简单地吃掉数据包而不会告诉发件人诸如"没有通往主机的路由"之类的信息。
b)由于错误的网络配置或线路过载而导致的数据包丢失
c)太多请求使服务器超载
d)服务器上少数同时可用的线程/进程导致所有线程/进程被占用。这种情况尤其发生在需要很长时间才能运行并可能与c)结合在一起的请求中。
希望这会有所帮助。
如果该URL在同一台计算机上的Web浏览器中正常运行,则可能是Java代码未使用该浏览器用于连接到该URL的HTTP代理。
错误消息说明了一切:您的连接超时。这意味着您的请求在某个(默认)时间范围内未得到响应。未收到响应的原因可能是以下之一:
a)IP /域或端口不正确
b)IP /域或端口(即服务)已关闭
c)IP /域花费的时间超过了您的默认超时时间
d)您的防火墙阻止了正在使用的任何端口上的请求或响应
e)您的防火墙阻止了对该特定主机的请求
f)您的互联网访问已关闭
g)您的活动服务器已关闭,即发生" rest-API call "。
请注意,您的ISP可能已设置防火墙和端口或IP阻止
我建议在获取输出流之前增加连接超时时间,如下所示:
1
| urlConnection.setConnectTimeout(1000); |
其中1000以毫秒为单位(1000毫秒= 1秒)。
我通过以下方式解决了我的问题:
1 2
| System.setProperty("https.proxyHost","myProxy");
System.setProperty("https.proxyPort","80"); |
或http.proxyHost ...
-
尝试执行Telnet以查看任何防火墙问题
-
执行tracert / traceroute以查找跳数
Why would a a€?java.net.ConnectException: Connection timed outa€?
exception occur when URL is up?
因为URLConnection(HttpURLConnection / HttpsURLConnection)不稳定。您可以在这里和这里阅读有关此内容的信息。
我们的解决方案有两件事:
a)通过setFixedLengthStreamingMode
设置ContentLength
b)捕获任何TimeoutException,如果失败则重试。
这可能是IPv6问题(主机发布了IPv6 AAAA地址,而用户主机认为该主机已配置为IPv6,但实际上未正确连接)。这也可能是网络MTU问题,防火墙阻止或目标主机可能发布了不同的IP地址(随机地或基于发件人所在的国家/地区),这些地址并非都可以访问。或类似的网络问题。
除了设置超时并添加良好的错误消息(尤其是打印出主机的已解析地址)之外,您不能做其他事情。如果要使其更加健壮,请添加重试,对所有地址进行并行尝试,并查看Java平台上的名称解析缓存(正负)。
发生这种情况的原因是,远程服务器只允许寻址某些IP地址,但不允许它自己的IP地址,而我试图从服务器的URL渲染图像...所以一切都会停止,显示您遇到的超时错误...
确保服务器允许其自己的IP,或者确保您从实际存在的某个远程URL呈现内容。
您的IP /主机有可能被远程主机阻止,尤其是当它认为您太用力了时。