Java getInputStream SocketTimeoutException вместо NoRouteToHostException - PullRequest
1 голос
/ 06 января 2011

У меня странная проблема, возникающая при попытке открыть несколько входных потоков (в отдельных потоках) в Linux (RHEL). Поведение работает как ожидалось в Windows.

Я запускаю 3 потока, чтобы открыть соединения https с 3 различными серверами. Все три являются недопустимыми IP-адресами (в этом тестовом примере), поэтому я ожидаю исключение NoRouteToHostException для каждого из них. Первые два возвращают их, как и ожидалось, и довольно быстро. (см. трассировку стека ниже) Однако третий (и 4-й, когда я тестировал его таким образом) НЕ дает исключения для маршрута. Они ждут целую вечность, а затем выдают исключение SocketTimeoutException (см. Другую трассировку стека ниже). Это займет много времени, чтобы вернуться, и не точно выразить проблему подключения.

Неправильная строка кода:

reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

Кто-нибудь видел что-то подобное раньше? Существуют ли многопоточные проблемы с сокетами на REHL или где-то есть ограничение на то, сколько может подключиться одновременно ... или ... что-то?

Ожидаемая трассировка стека, полученная для первых двух:

java.net.NoRouteToHostException: No route to host
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:559)
        at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
        at sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:272)
        at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:916)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1177)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)

Неожиданная трассировка стека, полученная 3-го числа:

java.net.SocketTimeoutException: connect timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:559)
        at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
        at sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:272)
        at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:916)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1177)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)

Ответы [ 3 ]

1 голос
/ 07 января 2011

Если недопустимый IP-адрес заблокирован, то никакого ответа не будет, и вы получите тайм-аут, а не «нет маршрута к хосту».Последнее зависит от сообщения об ошибке ICMP, получаемого из сети.

1 голос
/ 06 января 2011

Брандмауэр linux блокирует соединение?Если вывод iptables -L заполнен, это может содержать ваш ответ.Вы также можете проверить, используя telnet localhost <portnumber>, чтобы проверить, доступен ли порт.Если это так, telnet должен сказать «подключен» и т. Д.

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

Ах.видите, я чувствую себя довольно глупо.В ответ на приведенные выше ответы я решил просто добавить ip-адреса в браузер и посмотреть, что произошло.Оказывается, я использовал следующие IP-адреса: 1.1.1.1 2.2.2.2 3.3.3.3

К сожалению, 3.3.3.3 - это действительный IP-адрес, который не отвечает.На самом деле все работало нормально.

Сейчас я использую правильные не маршрутизируемые IP-адреса 10.27.1.1 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...