在我的应用程序中,我打开 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);
正如您在这段代码中看到的那样,我尝试以较小的超时时间(1 毫秒)打开一个连接,以确保连接超时。然后我尝试读取输入流
问题是,有时在尝试读取流时我得到一个java.net.SocketTimeoutException: connect timed out
(这是我所期望的),但循环有时会结束,显示读取的字节数(32912)
谁能解释一下为什么有时会发生第二种行为?我试图用谷歌搜索它,但没有发现任何关于此的信息。
谢谢