ConnectTimeout并不总是阻止从输入流读取?

时间:2013-11-12 21:57:01

标签: java timeout urlconnection

在我的应用程序中,我打开了UrlConnections,并设置了连接超时。 有时会抛出超时,但输入流仍然可读(并且确实包含数据)

我使用以下代码成功地重复了这个:

    System.setProperty("http.keepAlive", "false");

    long length = 0;

    while (length == 0) {
        HttpURLConnection connection = null;
        try {
            connection = (HttpURLConnection) (new URL("http://www.worldofwargraphs.com").openConnection());
            connection.setConnectTimeout(1); // 1ms
            connection.connect();
        } catch (IOException ex) {
            try {
                byte[] buf = new byte[8196];
                try (InputStream is0 = connection.getInputStream(); InputStream is = new BufferedInputStream(is0, 8196)) {
                    if (is0 != null) {
                        int ret = 0;
                        while ((ret = is.read(buf)) > 0) {
                            length += ret;
                        }
                    }
                }
            } catch (IOException ex2) {
                Logger.getLogger(JavaApplication6.class.getName()).log(Level.SEVERE, null, ex2);
            }
        }
    }

    System.out.println(length);

正如您在此代码中看到的,我尝试使用小超时(1ms)打开连接以确保连接超时。然后我尝试阅读输入流

问题在于,有时在尝试读取流时,我得到java.net.SocketTimeoutException: connect timed out(这是我期望的),但循环有时结束,显示字节数阅读(32912)

有人能解释我为什么会出现这种第二种行为吗? 我试图谷歌,但没有发现这一点。

谢谢

1 个答案:

答案 0 :(得分:0)

你那可笑的短连接超时已过期,但连接随后完成,所以你可以阅读。请注意,设置连接超时不会设置读取超时,因此读取将被阻止,直到数据可用。

编辑:无论如何你的代码都是错误的。你应该设置一个真实的连接超时并关闭套接字。在连接异常之后继续读取代码没有任何意义。