【问题标题】:Java getInputStream SocketTimeoutException instead of NoRouteToHostExceptionJava getInputStream SocketTimeoutException 而不是 NoRouteToHostException
【发布时间】: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)

【问题讨论】:

    标签: java linux sockets https


    【解决方案1】:

    Linux 防火墙是否阻止了连接?如果iptables -L 的输出被填充,可能包含您的答案。您也可以使用telnet localhost <portnumber> 进行测试,以检查端口是否可用。如果是,telnet 应该说“已连接”等。

    【讨论】:

      【解决方案2】:

      如果无效 IP 地址被黑洞,则不会返回任何响应,并且您将获得超时而不是“没有到主机的路由”。后者依赖于从网络接收回的 ICMP 错误消息。

      【讨论】:

        【解决方案3】:

        啊。看到现在我觉得挺傻的。根据上面的回复,我决定将 ip 地址放入浏览器中,看看发生了什么。原来我使用的是以下 IP 地址: 1.1.1.1 2.2.2.2 3.3.3.3

        很遗憾,3.3.3.3 是一个有效的 IP 地址,它没有响应。所以事实上它一直运行良好。

        我现在正在使用正确的不可路由 IP 地址 10.27.1.1 等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-20
          • 1970-01-01
          • 2011-06-22
          • 2012-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-11
          相关资源
          最近更新 更多