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

时间:2020-03-05 18:59:48  来源:igfitidea点击:

我从我的代码中以某种频率收到了一个" ConnectException:连接超时"。我尝试访问的URL已启动。相同的代码对某些用户有效,但对其他用户无效。似乎一旦一个用户开始获取此异常,他们便会继续获取该异常。

这是堆栈跟踪:

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

解决方案

回答

IP /主机有可能被远程主机阻止,特别是如果它认为我们太用力了。

回答

连接超时(假设本地网络和多台客户端计算机)通常是由于

a)某种防火墙,其方式是简单地吃掉数据包而没有告诉发送方诸如"主机无路由"之类的信息

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

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

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

希望这可以帮助。

回答

如果该URL在同一台计算机上的Web浏览器中运行良好,则可能是Java代码未使用该浏览器用于连接到该URL的HTTP代理。

回答

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

urlConnection.setConnectTimeout(1000);

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

回答

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