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

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

Why would a “java.net.ConnectException: Connection timed out” exception occur when URL is up?

我从我的代码中得到了某个频率的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 /主机有可能被远程主机阻止,尤其是当它认为您太用力了时。


推荐阅读

    linux命令行打开浏览?

    linux命令行打开浏览?,系统,网络,网址,工具,密码,首页,服务,网站,数据,地址,l

    怎么打开linux命令框?

    怎么打开linux命令框?,系统,首页,终端,信息,情况,命令,窗口,快捷键,界面,桌

    linux命令基础代码?

    linux命令基础代码?,基础,系统,管理,工作,代码,网络,单位,信息,数据,命令,lin

    linux打开图像命令?

    linux打开图像命令?,系统,电脑,密码,地址,图形界面,位置,情况,代码,工具,命

    linux下打开串口命令?

    linux下打开串口命令?,设备,系统,平台,名称,信息,数据,分析,地址,软件,工具,

    linux打开命令终端?

    linux打开命令终端?,系统,首页,终端,图片,发行,一致,命令,选项,桌面,文件,lin

    linux打开代码命令行?

    linux打开代码命令行?,系统,首页,工具,终端,代码,密码,情况,命令,快捷键,窗

    linux打开网络命令?

    linux打开网络命令?,网络,系统,地址,工作,信息,工具,管理,命令,基础,状态,Lin

    linux命令行打开火狐?

    linux命令行打开火狐?,咨询,系统,火狐,软件,首页,浏览器,设备,官方网站,环

    linux命令打开压缩?

    linux命令打开压缩?,系统,命令,工具,管理,电脑,文件,标准,信息,平台,格式,lin

    linux打开文件夹命令?

    linux打开文件夹命令?,工作,系统,信息,命令,图片,文件,管理,发行,名字,名称,

    linux克隆代码命令?

    linux克隆代码命令?,系统,代码,文件,命令,目录,源文件,文件夹,路径,目标,表

    linux打开控制台命令?

    linux打开控制台命令?,工作,系统,信息,地址,命令,目录,基础,工具,管理,第一,l

    linux防火墙打开命令?

    linux防火墙打开命令?,系统,管理,密码,服务,软件,状态,工具,防火墙,情况,命

    打开终端的命令linux?

    打开终端的命令linux?,系统,首页,终端,命令,第一,信息,情况,网络,桌面,选项,l

    linux打开编辑命令?

    linux打开编辑命令?,工作,系统,命令,地址,状态,信息,数据,工具,文件,目录,Lin

    打开终端的命令linux?

    打开终端的命令linux?,系统,首页,终端,命令,第一,信息,情况,网络,桌面,选项,l

    linux打开显示器命令?

    linux打开显示器命令?,信息,工具,系统,环境,发行,实时,数据,设备,命令,文件,L

    linux打开编辑命令?

    linux打开编辑命令?,工作,系统,命令,地址,状态,信息,数据,工具,文件,目录,Lin

    linux显存频率命令?

    linux显存频率命令?,情况,系统,信息,工具,工作,命令,环境,数字,电脑,发行,查