AIX: IBM Java: java.net.SocketException: истекло время ожидания соединения: возможно, из-за неверного адреса - PullRequest
4 голосов
/ 18 октября 2008

Мы очень часто видели следующие исключения в IBM AIX при попытке установить SSL-соединение с нашим сервером:

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 намекают на проблему с http-кодом, но я не мог понять, как это будет связано.

Это то, что другие видели в AIX недавно?

Ответы [ 3 ]

3 голосов
/ 18 октября 2008

«java.net.SocketException: Socket closed» означает, что ваша сторона закрыла сокет. Вы говорите, что это происходит, когда вы пытаетесь установить SSL-соединение с вашим сервером. Однако трассировка стека предполагает, что это происходит, когда HTTPClient пытается записать HTTP-запрос по уже установленному соединению.

Это может произойти, если, например, вам каким-то образом удалось заставить HTTPClient отправлять запрос через соединение, которое ранее было закрыто HTTPClient или, что более вероятно, каким-либо другим кодом на вашей стороне. Проверьте, обращаетесь ли вы где-нибудь к соответствующему сокету. Или может быть так, что сокет закрыт по протоколу SSL / TLS (если я не ошибаюсь, SSL / TLS имеет свой собственный протокол более высокого уровня для закрытия основного соединения), но HTTPClient каким-то образом удалось этого не заметить (дон Не знаю, возможно ли это, но, скажем, удаленная сторона закрыла соединение SSL, но использовала постоянные соединения HTTP / 1.1 и не установила соединение: закрытый ответ).

Вы можете устранить эти проблемы, проанализировав трафик TCP с помощью tcpdump / Wireshark. Вы также можете запустить stunnel на компьютере с HTTPS-портом сервера, а затем заставить свой код взаимодействовать с сервером по обычному HTTP через этот туннель. Это должно позволить вам видеть HTTP-трафик в текстовом виде.

«java.net.SocketException: Тайм-аут соединения» означает, что TCP-соединение не может быть установлено из-за тайм-аута. Возможно, пакеты сбрасываются брандмауэром. Например, может случиться так, что вам нужно использовать HTTP-прокси для выполнения запросов HTTPS. Может также случиться так, что серверный компьютер действительно занят или сеть действительно занята. Опять же, я предлагаю вам попробовать tcpdump / Wireshark, чтобы увидеть, что происходит на уровне TCP.

0 голосов
/ 25 января 2011

Я не удивлюсь, если это не сработает!

указанное время ожидания - это время ожидания для получения соединения от указанного диспетчера соединений, а не фактическое время ожидания сокета или сервера, для которого требуется другой набор настроек.

0 голосов
/ 18 октября 2008

У меня были проблемы с 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>
...