我的代码中有一些频率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);
}
答案 0 :(得分:77)
连接超时(假设本地网络和多台客户端计算机)通常来自
a)某种防火墙在途中只是吃掉数据包而不告诉发件人“没有路由到主机”这样的东西
b)由于错误的网络配置或线路过载导致的数据包丢失c)太多请求重载服务器
d)服务器上的少量同时可用的线程/进程导致所有线程/进程被占用。这种情况尤其发生在需要很长时间才能运行的请求中,并且可能与c)结合使用。
希望这有帮助。
答案 1 :(得分:29)
如果URL在同一台计算机上的Web浏览器中正常工作,则可能是Java代码未使用浏览器用于连接到URL的HTTP代理。
答案 2 :(得分:5)
错误消息说明了一切:您的连接超时。这意味着您的请求未在某个(默认)时间范围内得到响应。没有收到答复的原因可能是:
a)IP /域或端口不正确
b)IP /域或端口(即服务)已关闭
c)IP /域的响应时间超过默认超时时间
d)您的防火墙阻止您正在使用的任何端口上的请求或响应
e)您的防火墙阻止了对该特定主机的请求
f)您的互联网访问已关闭
g)您的实时服务器已关闭,即“rest-API调用”。
请注意,您的ISP可能已安装防火墙和端口或IP阻止
答案 3 :(得分:4)
我建议在获取输出流之前提高连接超时时间,如下所示:
urlConnection.setConnectTimeout(1000);
其中1000以毫秒为单位(1000毫秒= 1秒)。
答案 4 :(得分:3)
tracert
/ traceroute
查找跳数答案 5 :(得分:2)
我解决了我的问题:
http.proxyHost
或if(get_post_meta($post->ID,'template',true)=="templateA") {
get_template_part("templateA");
} else if(get_post_meta($post->ID,'template',true)=="templateB") {
get_template_part("templateB");
} else {
get_template_part("templateDefault");
}
...
答案 6 :(得分:1)
这可能是IPv6问题(主机发布IPv6 AAAA-Address,用户主机认为它是为IPv6配置的,但实际上并未正确连接)。这也可能是网络MTU问题,防火墙块,或者目标主机可能发布不同的IP地址(随机或基于发起者国家/地区),这些IP地址并非全部可访问。或者similliar网络问题。
除了设置超时和添加好的错误消息(尤其是打印出主机的已解析地址)之外,您无法做很多事情。如果你想让它更健壮,可以添加重试,并行尝试所有地址,还可以在Java平台上查看名称解析缓存(正面和负面)。
答案 7 :(得分:1)
为什么“ java.net.ConnectException:连接超时” URL打开时会发生异常吗?
因为URLConnection(HttpURLConnection / HttpsURLConnection)不稳定。您可以阅读有关此here和here的信息。 我们的解决方案有两件事:
a)通过= default
b)捕获任何TimeoutException,如果失败则重试。
答案 8 :(得分:0)
您的IP /主机有可能被远程主机阻止,特别是如果它认为您的攻击太难了。
答案 9 :(得分:0)
之所以发生这种情况,原因是远程服务器只允许某些IP地址而不是它自己的地址,我试图从服务器的URL中渲染图像......所以一切都会停止,显示你有的超时错误......
确保服务器允许自己的IP,或者从正在存在的某个远程URL渲染内容。