【发布时间】:2017-02-16 09:19:48
【问题描述】:
我正在编写 Android 应用程序以从网站下载特定文件(当前为 20M 字节)以进行测试。我使用 URLConnection 和 BufferedInputStream。
下载几兆字节后,我收到 IOException Connection Reset By Peer。
inputStream.read() 暂停了大约 130 秒,然后引发了异常。
通过几次尝试,我注意到下载的字节数为 11,272,192 或 11,010,048,知道文件可以从 PC 正常下载。
以下是我使用的代码sn-p:
@Override
protected String doInBackground(String... f_url) {
try {
URL url = new URL(f_url[0]);
HttpURLConnection conection = (HttpURLConnection) url.openConnection();
conection.setConnectTimeout(5000);
conection.setReadTimeout(5000);
conection.setDoOutput(false);
conection.connect();
// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(), 8192);
...
do {
byte data[] = new byte[1024];;
if (((count = input.read(data)) == -1)) {
break;
}
sum+=count;
...
} while (true);
input.close();
conection.disconnect();
} catch (Exception e) {
...
}
return null;
}
我想知道是什么导致了这个问题,以及如何避免它。
我阅读了多个(类似主题)问题,但没有一个有帮助。他们都同意代码没有问题并且是网络(或主机)问题。但我需要知道下载失败的原因以及如何克服它
知道了
- 我将同一个文件移动到不同的主机,但同样的问题
- 在不同的时间下载从未成功
【问题讨论】:
-
data = new byte[dataCount];。您是否正在创建一个 11 MB 的缓冲区?为了什么?你只有一个 read() 11MB?之后你打算用那个缓冲区做什么?input.available()不是经常传递错误的值吗?您是否检查过它们在服务器上的文件大小是否相等? -
如果你确实可以在一次 read() 中读取
dataCount字节,那么如果count==dataCount则你应该打破循环。 -
there is nothing wrong with code。代码看起来不太好。 -
我最近添加了 input.available() 作为尝试,但没有成功。一般代码没有问题,但是有些东西使下载中断。我没有分配 11MB 缓冲区,但下载在 ~11MB 时中断。我更新了代码以避免混淆。
-
input.available() 不返回文件大小,而是缓存(或获取)字节,它是千字节的倍数,不再是 65k(从调试中注意到),但有时为 0。所以我删除了它。
标签: java android httpurlconnection urlconnection