什么是“SocketTimeoutException连接超时”,如何解决?

3
我正在尝试从Java客户端调用远程Tomcat服务器,但我偶尔会遇到SocketTimeoutException:连接超时。 (http://docs.oracle.com/javase/7/docs/api/java/net/SocketTimeoutException.html)
以下是堆栈跟踪:
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:382)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:241)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:228)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:365)
        at java.net.Socket.connect(Socket.java:527)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:570)
        at org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory.createSocket(EasySSLProtocolSocketFactory.java:189)
        at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:706)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:386)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)

这不一致,经过我的多次连接尝试后它消失了。

我知道socketTimeout的含义,但我没有遇到读取超时,而是连接超时,这意味着客户端无法与服务器建立tcp连接。这意味着服务器忽略了客户端尝试连接它的请求,因为要么它不可用,要么在该端口上正在做其他事情。我知道我的服务器是可达的并且正在运行。

显然,我的连接服务器的尝试被拒绝了,我想找出原因。我该如何开始?我应该查找什么?我的服务器在运行着一个EC2实例上的redhat linux盒子上,有没有办法查看我的连接被拒绝的原因?


什么是确切的异常?你给出了两个版本。我本来期望要么是ConnectException:'连接超时',当尝试连接时,要么是SocketTimeoutException:'连接超时',当进行I/O操作时。 - user207421
你应该添加更多细节,比如“服务器”、框架、语言、目的、已经检查过的日志。是在同一网络下吗?还是远程连接?使用了 VPN 吗?使用的协议是什么?现在你只是说“我的程序出问题了”。 - guilespi
已更新描述,请告诉我现在是否更清晰易懂,或者您需要其他具体细节。谢谢。 - user2562732
请确保您已经发布了“精确”的异常和错误消息。我之前问过你了。我仍然不相信你已经这样做了。请同时包含堆栈跟踪。 - user207421
添加了异常和堆栈跟踪。 - user2562732
1个回答

3
可能的原因是其他进程或Tomcat本身消耗资源导致应用程序无响应。
开始监视服务器资源:
- CPU - 内存 - 网络活动 - 打开的句柄(如果您在Linux上运行)
不稳定性可能是因为只有在服务器处于负载状态时连接才会失败。
您还可以尝试在服务器上增加连接超时,可以参考这个之前的问题:stackoverflow链接

不是这样的。那会导致读取超时,而不是“连接超时”。 - user207421
谁这么说的?如果您的句柄用完了,服务器将无法接受新连接、打开套接字、启动线程等。ulimit -a - guilespi
如果您的资源已经用尽,服务器进程将无法从accept()获取新的套接字,但操作系统会在此之前在等待队列上创建连接。因此,资源耗尽并不是连接超时的原因。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接