4

在尝试与我们的服务器建立 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 上看到的吗?

4

3 回答 3

3

“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 端口的通道,然后让你的代码通过这个通道通过普通的 HTTP 与服务器通信。这应该使您能够以明文形式查看 HTTP 流量。

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

于 2008-10-17T22:53:54.353 回答
0

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

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

于 2011-01-25T05:16:20.107 回答
0

我遇到了通过使用多线程连接更正的 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>
于 2008-10-17T21:28:37.600 回答