AIX:IBM Java:java.net.SocketException:连接超时:可能是由于地址无效

Posted

技术标签:

【中文标题】AIX:IBM Java:java.net.SocketException:连接超时:可能是由于地址无效【英文标题】:AIX: IBM Java: java.net.SocketException: Connection timed out:could be due to invalid address 【发布时间】:2010-09-17 20:24:39 【问题描述】:

在尝试与我们的服务器建立 SSL 连接时,我们在 IBM AIX 上经常看到以下异常:

java.net.SocketException: Socket closed
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275(Compiled Code))
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(DashoA6275(Compiled Code))
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java(Inlined Compiled Code))
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java(Compiled Code))
at java.io.FilterOutputStream.flush(FilterOutputStream.java(Compiled Code))
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java(Compiled Code))
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java(Compiled Code))
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java(Compiled Code))
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java(Compiled Code))
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java(Compiled Code))
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java(Compiled Code))
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java(Inlined Compiled Code))
at com.eximtechnologies.httptransport.client.ClientTransport.receiveMessages(ClientTransport.java(Compiled Code))
at com.eximtechnologies.httptransport.client.ClientTransport.receiveMessages(ClientTransport.java(Inlined Compiled Code))
at com.eximtechnologies.ecserver.connection.XMSHTTPConnection.checkForNewMessages(XMSHTTPConnection.java(Compiled Code))
at com.eximtechnologies.ecserver.connection.XMSHTTPConnection.timeoutExpired(XMSHTTPConnection.java(Compiled Code))
at com.eximtechnologies.xmd.timer.TimerEvent$1.run(TimerEvent.java(Compiled Code))

从错误来看,你会认为这只是一个网络问题,但客户在大约 2 个月前从未遇到过这个问题,而且 AFAIK,网络布局没有任何变化。

我们也经常收到这个:

java.net.SocketException: Connection timed out:could be due to invalid address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:336)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:201)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:188)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.connect(Socket.java:428)
at java.net.Socket.<init>(Socket.java:335)
at java.net.Socket.<init>(Socket.java:210)
at javax.net.ssl.SSLSocket.<init>(Unknown Source)

我怀疑这是 AIX 的问题,但我猜可能是防火墙问题?我还在 google 搜索中看到有人暗示 commons http 存在问题,但我看不出这有什么关系。

这是其他人最近在 AIX 中看到的吗?

【问题讨论】:

【参考方案1】:

我遇到了使用多线程连接更正的 http 客户端问题。我们通过从下面的第一个配置移动到第二个配置来修复它:

<bean id="httpClient" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
    <property name="httpClient">
        <bean class="org.apache.commons.httpclient.HttpClient">
            <property name="connectionTimeout"><value>1000</value></property>
            <property name="timeout"><value>3000</value></property>
        </bean>
    </property>
</bean>

<bean id="httpClient" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
    <property name="httpClient">
        <bean class="org.apache.commons.httpclient.HttpClient">
            <property name="connectionTimeout"><value>1000</value></property>
            <property name="timeout"><value>3000</value></property>
            <property name="httpConnectionManager">
              <bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager" destroy-method="shutdown">
                <property name="params">
                  <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
                    <property name="defaultMaxConnectionsPerHost" value="20" />
                  </bean>
                </property>
              </bean>
            </property>
        </bean>
    </property>
</bean>

【讨论】:

【参考方案2】:

“java.net.SocketException: Socket closed”表示你这边关闭了socket。您说当您尝试与服务器建立 SSL 连接时会发生这种情况。但是,堆栈跟踪表明当 HTTPClient 尝试通过已建立的连接写入 HTTP 请求时会发生这种情况。

例如,如果您以某种方式设法使 HTTPClient 通过先前由 HTTPClient 关闭的连接发送请求,或者更有可能由您身边的其他代码关闭,则可能会发生这种情况。检查您是否正在某处访问底层套接字。或者可能是 SSL/TLS 协议关闭了套接字(如果我没记错的话,SSL/TLS 有自己的更高级别的协议来关闭底层连接),但是 HTTPClient 不知何故设法没有注意到这一点(不要'不知道这是否可能,但是,比如说,远程端关闭了 SSL 连接,但使用的是 HTTP/1.1 持久连接并且没有设置 Connection: close 响应)。

您可以通过使用 tcpdump/Wireshark 分析 TCP 流量来解决这些问题。您还可以在机器上启动到服务器 HTTPS 端口的 stunnel,然后让您的代码通过此隧道通过纯 HTTP 与服务器通信。这应该使您能够以明文形式查看 HTTP 流量。

“java.net.SocketException: Connection timed out”表示TCP连接因超时而无法建立。可能是数据包被防火墙丢弃了。例如,您可能需要使用 HTTP 代理来发出 HTTPS 请求。也可能是服务器机器真的很忙或网络真的很忙。同样,我建议您尝试 tcpdump/Wireshark 以查看 TCP 级别发生了什么。

【讨论】:

【参考方案3】:

如果它不起作用,我不会感到惊讶!

指定的超时是从指定的连接管理器获取连接的超时,而不是需要不同设置的实际套接字或服务器超时。

【讨论】:

以上是关于AIX:IBM Java:java.net.SocketException:连接超时:可能是由于地址无效的主要内容,如果未能解决你的问题,请参考以下文章

IBM产品系列和AIX系统版本

IBM AIX系统里一些专业缩写的含义

(转)IBM AIX系统为rootvg实现镜像

IBM AIX存储层结构介绍 / 常用命令整理

IBM Aix系统添加硬盘步骤

在IBM AIX box上下载并安装必要的OSS RPM