Что может вызвать исключение socket ConnectException: время ожидания соединения истекло?

У нас есть клиент Webstart, который общается с сервером, отправляя сериализованные объекты по HTTPS, используя java.net.HttpsURLConnection .

Все работает отлично на моем локальном компьютере и на тестовых серверах, расположенных в нашем офисе, но я испытываю очень, очень странную проблему, которая возникает только на наших производственных и промежуточных серверах (и при этом спорадически). Основное различие, которое я знаю между этими серверами и серверами в нашем офисе, заключается в том, что они расположены в другом месте, и связь клиент-сервер с ними значительно медленнее, но и до этого в продакшене долгое время работала нормально.

В любом случае, вот что происходит:

  • Клиент после установки таких параметров, как тайм-аут чтения и таких свойств, как Content-Type в HttpURLConnection , вызывает getOutputStream () , чтобы получить поток для записи.
  • На этом этапе, насколько я могу судить, клиент зависает на некоторое время.
  • Затем клиент выдает следующее исключение:
java.net.ConnectException: Connection timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source)
    at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)

Обратите внимание, что это не исключение SocketTimeoutException , которое используется методом connect () HttpURLConnection сообщает, что он выдает ошибку, если время ожидания истекает до того, как соединение может быть установлено. Кроме того, когда это происходит, я могу вызвать conn.getResponseCode () и получаю код ответа 200.

  • На стороне сервера EOFException выдается в Конструктор ObjectInputStream , который пытается прочитать заголовок сериализации, но терпит неудачу, потому что клиент никогда не получает OutputStream для записи.

Если это помогает, Кроме того, другие приложения, работающие в той же сети, не сообщали о подобных проблемах.

Кто-нибудь знает, в чем может быть причина этого, и даже что мне следует расследовать?

10
задан ColinD 7 October 2010 в 13:32
поделиться