HttpURLConnection读取超时

4
我有以下代码用于从URL下载文件:
HttpURLConnection urlConn = (HttpURLConnection)urlOfFile.openConnection();
urlConn.setConnectTimeout(5000);
urlConn.setReadTimeout(10000);

StatusInfo.fileSizeTobeDownload = urlConn.getContentLength();

InputStream reader = urlConn.getInputStream();

FileOutputStream writer = new FileOutputStream(downloadFolder+fileName);
byte[] buffer = new byte[1024]; 
int bytesRead = 0;  
while ((bytesRead = reader.read(buffer)) > 0) {
    writer.write(buffer, 0, bytesRead);
    buffer = new byte[1024];
    StatusInfo.fileSizeDownloaded+=bytesRead;
}
writer.close();
reader.close();

这段代码本来是可以正常工作的,但有时会出现以下错误:
java.net.SocketTimeoutException: Read timed out
 at java.net.SocketInputStream.socketRead0(Native Method)
 at java.net.SocketInputStream.read(SocketInputStream.java:146)
 at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
 at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:554)
 at sun.security.ssl.InputRecord.read(InputRecord.java:509)
 at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:850)
 at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:807)
 at sun.security.ssl.AppInputStream.read(AppInputStream.java:94)
 at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
 at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
 at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
 at sun.net.www.MeteredStream.read(MeteredStream.java:134)
 at java.io.FilterInputStream.read(FilterInputStream.java:133)
 at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2582)
 at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2577)

没有任何网络中断。是否有其他方法来配置“ReadTimeout”。


我不确定,但可能是你的网络速度太慢了,或者它需要一些时间来响应。 - Pragnani
我们的速度很快,我尝试从3-4台机器同时下载,其中一台机器失败了,在每次重试后仍然失败,但经过一段时间后成功下载。 - Naresh
2个回答

1
这个问题没有意义。你设置了读取超时,你得到了一个读取超时。如果你比预期早得到它,就把它设置得更长。你需要配置读取超时的唯一“其他方法”是更改超时值。应该设置为多少只有你知道,因为只有你知道为什么要设置它。对我来说,10秒似乎太短了。
注意,你不需要不断重新创建读取缓冲区。你只是在创建大量垃圾。

我在测试时运行ping到8.8.8.8,没有任何ping的丢失,但是出现了错误。10秒足以看到ping的丢失。我认为我在非常短的时间内超时了,即使ping没有失败。 - Naresh
Ping 成功或失败与此无关,它与您的服务器响应速度有关。您只允许它使用十秒钟。这太短了。 - user207421

0

这意味着服务器在ReadTimeout中没有响应,可能是服务器关闭了或处理线程被阻塞或服务器太忙了。


如果“服务器已关闭”,您将不会收到此异常。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接