it-swarm.cn

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

我从我的代码中获得了一些带有频率的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);
}
79
Sarah Haskins

连接超时(假设本地网络和多个客户端计算机)通常来自

a)某种防火墙在简单地吃掉数据包的方式而不告诉发送者诸如“无路由到主机”之类的东西

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

c)太多请求超载服务器

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

希望这可以帮助。

77
Jumpy

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

29
Alexander

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

a)IP /域或端口不正确

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

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

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

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

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

g)您的实时服务器已关闭,即“rest-API调用”。

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

5
M Hamza Javed

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

urlConnection.setConnectTimeout(1000);

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

4
Powerlord
  • 尝试使用Telnet查看任何防火墙问题
  • 执行tracert/traceroute查找跳数
3
shahbaz sikander

我解决了我的问题:

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

http.proxyHost...

2
NikNik

这可能是IPv6问题(主机发布IPv6 AAAA-Address,用户主机认为它是为IPv6配置的,但实际上没有正确连接)。这也可能是网络MTU问题,防火墙阻塞或目标主机可能会发布不可达的不同IP地址(随机或基于发起人国家/地区)。或者similliar网络问题。

除了设置超时和添加好的错误消息(尤其是打印出主机的已解析地址)之外,您还无法做很多事情。如果你想让它更健壮,可以添加重试,并行尝试所有地址,还可以在Java平台上查看名称解析缓存(正面和负面)。

1
eckes

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

0
larsivi

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

确保服务器允许自己的IP,或者从正在存在的某个远程URL渲染内容。

0
Damir Olejar