Android下载器之限速篇

栏目: Java · 发布时间: 5年前

内容简介:终于考完了马原完成了大学的最后一门考试,可以愉快的写代码了~今天就来记录一下市面上常见的专业下载器都会提供下载/上传限速这个功能,那限速究竟是限的哪一个速度呢?我们都知道HTTP/HTTPS的传输层协议是TCP,TCP是基于字节流的。字节流在Java中对应的就是

终于考完了马原完成了大学的最后一门考试,可以愉快的写代码了~今天就来记录一下 我的下载器 中是如何实现限速的。

0x02 限速的对象

市面上常见的专业下载器都会提供下载/上传限速这个功能,那限速究竟是限的哪一个速度呢?

我们都知道HTTP/HTTPS的传输层协议是TCP,TCP是基于字节流的。字节流在 Java 中对应的就是 InputStreamOutputStream 。基于TCP的传输层下载/上传的步骤一般是

  • 建立TCP连接,对应Java的 Socket.connect() 。这期间会经历三次握手,是一个耗时过程,可以使用连接复用优化( OKHttp 已经做了连接池缓存)。
  • 连接成功后就可以根据需要收发数据,利用Socket获取到连接的 InputStreamOutputStream 操作即可。
  • 关闭连接。

以下载为例,首先连接步骤是不需要限速的,因为连接部分通常是很快的,并且往往都想要连接更加快速。所以,我们限速的对象肯定就是从socket的 InputStream 这一步骤。

0x03 如何“限速”?

首先,这里的限速并不是真的限制读写数据流每时每刻的速度。这里要分清高中物理学过的两个概念—— 瞬时速度平均速度

设 为 时刻下载的字节, 为下载速度则有:

下载的瞬时速度和很多东西有关:硬件、网络状况、系统等, 是我们无法控制的。 但是有一个东西我们是,那就是 。

我们下载的时候往往是在一个循环中不断的从网络读取数据到内存。我们可以在 read 之前记录时间 , read 操作之后记录时间 。然后假设我们想要将下载的速度限制为 ,那么,我们读取这段 字节的数据期望耗时为:

则当 时,说明当前下载速度快,我们就可以调用 Thread.sleep() 这段时间,使得在宏观上下载的平均速度在我们的限制条件内。

另外,如果是多线程多任务,实际上平均分配速度即可。即任务间平均分配总速度,任务内线程平均分配任务获得的速度; 时是符合限制的。

0x04 代码实现

// 连接、获取输入流
...

int readSize;
long start;

do {
    start = System.nanoTime();
    readSize = inputStream.read(buffer, 0, buffer.length);
    // targetBps是这个任务分配到的速度,targetBps < 0表示不限速
    if (readSize > 0 && targetBps > 0) {
        // downloadThreadCount是下载线程数
        long sleepDurarion = (long) (readSize * 1000.0 / (targetBps / Math.max(downloadThreadCount, 1)) - (System.nanoTime() - start) / 1000_000.0);
        
        if (sleepDuration > 0) {
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                // do nothing
            }
        }
    }
} while (readSize > 0);
复制代码

0x05 其他

上面主要是以下载为例,事实上任何 I/O流 的操作都可以通过这种方式在宏观上“限速”。

因为这种方法限制的是平均速度,所以如果装有网速监测软件,可能会看到波动的网络速度变化。

实现了限速功能的下载器 项目传送门 ,支持多任务、多线程、多进程、断点续传、速度限制等等...


以上所述就是小编给大家介绍的《Android下载器之限速篇》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Applications (Hacking Exposed)

Web Applications (Hacking Exposed)

Joel Scambray、Mike Shema / McGraw-Hill Osborne Media / 2002-06-19 / USD 49.99

Get in-depth coverage of Web application platforms and their vulnerabilities, presented the same popular format as the international bestseller, Hacking Exposed. Covering hacking scenarios across diff......一起来看看 《Web Applications (Hacking Exposed)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具