Java HttpUrlConnection和setReadTimeout()方法

Java HttpUrlConnection和setReadTimeout()方法,java,sockets,http,tcp,httpurlconnection,Java,Sockets,Http,Tcp,Httpurlconnection,我想知道“java.net.SocketTimeoutException readtimeout”何时以及为什么被引发 URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setConnectTimeout(5000); con.setReadTimeout(421); int respo

我想知道“java.net.SocketTimeoutException readtimeout”何时以及为什么被引发

    URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setConnectTimeout(5000);
        con.setReadTimeout(421);

        int responseCode = con.getResponseCode();

        InputStream is =    con.getInputStream();
        System.out.println("Inputstream done");

        FileOutputStream fos = fos = new FileOutputStream("D:\\tryfile\\file1.csv");

        byte[] buffer = new byte[4096];              //declare 4KB buffer
            int len;

            while ((len = is.read(buffer)) > 0) {

                fos.write(buffer, 0, len);
            }

          fos.close();
          is.close();
问题是,我设置了读取超时值421,并在第55行执行“java.net.SocketTimeoutException readtimeout”异常

while ((len = is.read(buffer)) > 0) {
因此,我成功地获取了inputstream,但当我开始读/写它时,我会获取这个异常。我会检查文件的732kb是否被传输,直到异常发生


所以我真的把它弄糊涂了。请准确地解释readtimeout方法。

当在
read()
调用开始到指定的超时从该点开始过期之间没有数据到达时,会引发该问题。换句话说,在超时时间内没有数据到达

所以我成功地接受了输入流

不足为奇。它花费的时间为零,在网络上什么也不做,正如您已经调用的
getResponseCode()
(并且什么也不做)

但当我开始读/写它时,我就有这个例外

因此,数据来得很慢

我检查文件的732kb是否被传输,直到异常发生

因此,数据的结尾来得很慢


NB 421ms对于读取超时来说太短了。应该是几十秒。

中是否有不清楚的地方?当我设置readtimeout 3000 ms时,我可以成功下载40 Mb的zip文件。(我在两分钟内下载它,没有超时)。因此我理解每次读取方法调用(在while中)都可以读取超时。例如,我理解,read time out value是读取方法的第二次和第三次调用之间的时间(在while中)。或者第三次和第四次、第四次和第五次调用之间的时间。对于启动新的指定超时的每次调用,它都是真的吗?否。在任何
read()
调用中都可能发生读取超时。这不是他们之间的问题。它不关心read()调用之间的间隔时间。它关心您何时输入数据,以及数据是否在从那时开始的超时时间内到达。您可以在read()调用之间休眠一千年而不会导致读取超时,如果对等方让连接保持了那么长的时间。但是程序通过第一次调用read方法从inputstream读取第一个4096 kb。然后它开始将其写入文件。因此,当程序写入第一个4096 kb时,它出现读取超时异常。İt写入732 kb,而继续写入第一个4096 kb时,它会出现异常。因此,它可以发生在读取调用之间(写入时),也可能发生在从inputstream读取数据时。这是真的吗?我已经回答过了。两次。它发生在read()调用内部,而不是它们之间。我无法理解您关于读取前4096字节、超时前4096字节以及写入整个732kb的相互矛盾的陈述。