Java Android URLConnection read()异常由对等方重置连接

Java Android URLConnection read()异常由对等方重置连接,java,android,httpurlconnection,urlconnection,Java,Android,Httpurlconnection,Urlconnection,我正在编写Android应用程序,以便从网站下载特定文件(目前为2000万字节),用于测试目的。我使用URLConnection和BufferedInputStream 下载数兆字节后,我收到对等方重置的IOException连接。 inputStream.read()暂停约130秒,然后引发异常。 通过几次尝试,我注意到下载的字节不是11272192就是11010048,因为我知道该文件可以从PC正常下载。 以下是我使用的代码片段: @Override protected String

我正在编写Android应用程序,以便从网站下载特定文件(目前为2000万字节),用于测试目的。我使用URLConnectionBufferedInputStream
下载数兆字节后,我收到对等方重置的IOException连接。
inputStream.read()暂停约130秒,然后引发异常。
通过几次尝试,我注意到下载的字节不是11272192就是11010048,因为我知道该文件可以从PC正常下载。
以下是我使用的代码片段:

@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;
    }
我想知道是什么导致了这个问题,以及如何避免它。
我读了多个(类似主题)的问题,但没有一个有帮助。他们都同意代码没有问题,这是网络(或主机)问题。但是我需要知道下载失败的原因以及如何克服它
知道

  • 我把同一个文件移到了不同的主机上,有相同的问题
  • 下载从未在不同的时间成功

当服务器通过发送RST数据包关闭连接时,会发生由对等错误重置的连接。服务器可以这样做的原因可能有很多-您可能使用了太多的资源,因此它可能会关闭连接,服务器配置中可能存在一些错误等。我也有同样的错误,所以我将缓冲区大小从1024更改为512,它工作了。我认为它工作了,因为这减少了服务器必须使用的资源。还将input.read(data)更改为input.read(data,0512)。

data=new byte[dataCount]。您正在创建11MB的缓冲区吗?为了什么?11MB只有一个read()?之后你打算怎么处理缓冲区?
input.available()
是否经常传递错误的值?您检查过服务器上的文件大小是否相等吗?如果您确实可以在一次读取()中读取
dataCount
字节,那么如果
count==dataCount
代码没有问题,您应该中断循环。代码看起来不太好。我最近添加了input.available(),作为一种尝试,但没有成功。代码总体上没有问题,但有一些东西让下载中断。我没有分配11MB的缓冲区,但下载中断约11MB。我更新了代码以避免混淆。input.available()不返回filesize,而是返回缓存(或提取)字节,它是KB的倍数,不超过65k(调试时注意到),但有时返回0。所以我把它拿走了。