【问题标题】:Android URLConnection read() Exception-Connection Reset by PeerAndroid URLConnection read() Exception-Connection Reset by Peer
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 2019-02-02
    • 1970-01-01
    • 2018-10-15
    • 2019-03-29
    • 1970-01-01
    • 2020-06-18
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多