2011-01-06 48 views
1

在Linux(RHEL)上嘗試打開多個輸入流(在單獨的線程中)時,發生了一個奇怪的問題。該行爲在Windows上按預期工作。Java getInputStream SocketTimeoutException而不是NoRouteToHostException

我正在踢掉3個線程來打開https連接到3個不同的服務器。這三個都是無效的IP地址(在這個測試用例中),所以我期望每個人都有一個NoRouteToHostException。前兩個按預期返回,並且很快。 (請參閱下面的堆棧跟蹤)然而,第三個(以及我以這種方式測試時的第四個)不會給出無路由例外。他們等待很長時間,然後給出一個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)

回答

0

啊。現在看到我感覺很傻。從上面的響應提示我決定只是把IP地址放入瀏覽器,看看發生了什麼。原來我用的是下面的IP地址: 1.1.1.1 2.2.2.2 3.3.3.3

不幸的是,3.3.3.3是一個有效的IP地址,沒有反應。事實上,它一直工作得很好。

我現在正在使用適當的非可路由IP地址10.27.1.1等。

1

是Linux防火牆阻斷連接?如果iptables -L的輸出填充可能包含您的答案。您也可以使用telnet localhost <portnumber>來檢查端口是否可用。如果是,telnet應該說「連接」等。

1

如果無效的IP地址被黑掉,那麼沒有響應會回來,並且你將得到一個超時而不是「沒有路由到主機」。後者依靠從網絡接收的ICMP錯誤消息。

相關問題