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
查找跳数