2011-01-06 33 views
1

Linux(RHEL)上で複数の入力ストリーム(別々のスレッド)をオープンしようとすると、奇妙な問題が発生します。この動作は、Windowsで期待通りに機能します。Java getInputStream NoRouteToHostExceptionの代わりにSocketTimeoutException

私は、3つの異なるサーバーへのhttps接続を開くために3つのスレッドを開始しています。この3つはすべて無効なIPアドレスです(このテストケースでは)ので、それぞれにNoRouteToHostExceptionが必要です。最初の2人は、期待どおりに、そしてすぐにこれを返します。 (下記のスタックトレースを参照してください)しかし、3番目(4番目の方法でそれをテストしたとき)にはルートの例外を与えません。彼らは年齢を待ってから、SocketTimeoutExceptionを与えます(下記の他のスタックトレースを参照)。これは時間がかかり、接続の問題を正確に表現しません。

コードの問題の行は次のとおりです。

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

は、誰もがこの前のようなものを見ていますか? REHL上のソケットや、一度に接続できる人数の制限など、マルチスレッドの問題がありますか? 3日に受け取ったとして、

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) 

予期しないスタックトレース:最初の2のために受け取ったとして、スタックトレース、期待

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は "connected"などと答えなければなりません。

1

無効なIPアドレスがブラックホールドされている場合、応答は返ってこないので、 "no route to host"ではなくタイムアウトになります。後者は、ネットワークから受信したICMPエラーメッセージに依存する。