【问题标题】:What is a "SocketTimeoutException connect time out" and how do I fix it?什么是“SocketTimeoutException 连接超时”,我该如何解决?
【发布时间】:2013-11-13 07:49:02
【问题描述】:

我正在尝试从 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 机器上运行,有没有办法可以查看我的连接被拒绝的原因?

【问题讨论】:

  • 什么是exact异常?你给出了两个版本。我会期望 ConnectException: 'connect timeout', 当尝试连接时,或 SocketTimeoutException: 'connection timed out', 当做 I/O 时。
  • 您应该添加更多详细信息,您已经检查过哪些“服务器”、框架、语言、用途、日志?同一个网络?偏僻的? vpn?正在使用的协议?现在你只是说“我的程序坏了”
  • 更新了描述,让我知道现在是否更有意义,或者您需要任何其他具体细节。谢谢。
  • 请确保您已发布准确异常和错误消息。我以前问过你。我还是不相信你已经做到了。还请包括堆栈跟踪。
  • 添加了异常和堆栈跟踪。

标签: java sockets tcp network-programming socket-timeout-exception


【解决方案1】:

可能的原因是其他进程或 Tomcat 本身消耗资源导致应用程序无响应。

开始监控服务器资源:

  • CPU
  • 内存
  • 网络活动
  • 打开句柄(你在 linux 上运行吗?)

可以解释间歇性,因为只有当服务器处于负载状态时连接才会失败。

你也可以尝试增加服务器as in this previous question的连接超时时间。

【讨论】:

  • 不,不是。这会导致读取超时,而不是“连接超时”。
  • 谁这么说的?如果您没有句柄,服务器将无法接受新连接、打开套接字、启动线程等。ulimit -a
  • 如果资源不足,服务器 进程 将无法从 accept() 获取新套接字,但操作系统会在积压队列中创建连接在此之前。所以资源耗尽不考虑连接超时。
猜你喜欢
  • 1970-01-01
  • 2012-02-18
  • 2019-01-14
相关资源
最近更新 更多