gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:10:54 25 4
gpt4 key购买 nike

在我的应用程序中,我打开 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)

谁能解释一下为什么有时会发生第二种行为?我尝试用谷歌搜索,但没有找到任何相关信息。

谢谢

最佳答案

您的连接超时时间短得离谱,但连接随后完成,因此您可以阅读。请注意,设置连接超时不会设置读取超时,因此读取会被阻止,直到数据可用为止。

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

关于java - ConnectTimeout 并不总是阻止从输入流读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19940734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com