【发布时间】:2011-06-04 19:33:49
【问题描述】:
尝试在 Linux (RHEL) 上打开多个输入流(在单独的线程中)时,我遇到了一个奇怪的问题。该行为在 Windows 上按预期工作。
我正在启动 3 个线程来打开到 3 个不同服务器的 https 连接。这三个都是无效的 IP 地址(在这个测试用例中),所以我希望它们每个都有一个 NoRouteToHostException。前两个按预期返回这些,而且很快。 (请参阅下面的堆栈跟踪)但是第三个(以及我以这种方式测试的第四个)没有给出无路由异常。他们等待很长时间,然后给出一个 SocketTimeoutException(参见下面的其他堆栈跟踪)。这需要很长时间才能恢复,并且不能准确地表达连接问题。
有问题的代码行是:
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
以前有人见过这样的东西吗? REHL 上的套接字是否存在多线程问题,或者在某处限制了一次可以连接的数量……或……什么?
预期的堆栈跟踪,前两个收到的:
java.net.NoRouteToHostException: 没有到主机的路由
在 java.net.PlainSocketImpl.socketConnect(本机方法)
在 java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
在 java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
在 java.net.Socket.connect(Socket.java:529)
在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:559)
在 sun.net.NetworkClient.doConnect(NetworkClient.java:158)
在 sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
在 sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
在 sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:272)
在 sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
在 sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:916)
在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1177)
在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
意外的堆栈跟踪,在 3 日收到:
java.net.SocketTimeoutException: 连接超时
在 java.net.PlainSocketImpl.socketConnect(本机方法)
在 java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
在 java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
在 java.net.Socket.connect(Socket.java:529)
在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:559)
在 sun.net.NetworkClient.doConnect(NetworkClient.java:158)
在 sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
在 sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
在 sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:272)
在 sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
在 sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:916)
在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1177)
在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
【问题讨论】: