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:连接超时:可能是由于地址无效的主要内容,如果未能解决你的问题,请参考以下文章