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

标签 java ssl aix apache-commons-httpclient

当尝试与我们的服务器建立 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 个月前从未遇到过这个问题,据我所知,网络布局没有任何变化。

我们也经常收到:

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 问题,但我猜它可能是一个防火墙问题?我还在谷歌搜索中看到一些人暗示 commons http 有问题,但我看不出这有什么关系。

这是其他人最近在 AIX 上看到的东西吗?

最佳答案

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

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

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

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

关于java - AIX:IBM Java:java.net.SocketException:连接超时:可能是由于地址无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/213857/

相关文章:

ssl - HTTPS Web(仅)代理

java - -Djava.library.path 是否适用于 UNIX JVM?

java - 如何在 Java 中使用 args 新建一个类?

java.lang.NullPointerException at org.apache.jsp.page_jsp._jspInit 在 Tomcat 6 中,但在 Tomcat 7 中有效

java - 接口(interface)如何打破类的依赖关系?

java - 如何在 C# 或 Java 中的握手期间读取 ocsp 装订响应

java - JScrollPane 在 JFrame 中不可滚动

azure - 即使明确信任,Windows 应用商店应用程序是否始终不允许自签名证书?

c++ - AIX CMakeTest 没有添加正确的 -lpthread

java - 获取响应代码时文件描述符泄漏。 (cxf, ssl)