内容简介:终于考完了马原完成了大学的最后一门考试,可以愉快的写代码了~今天就来记录一下市面上常见的专业下载器都会提供下载/上传限速这个功能,那限速究竟是限的哪一个速度呢?我们都知道HTTP/HTTPS的传输层协议是TCP,TCP是基于字节流的。字节流在Java中对应的就是
终于考完了马原完成了大学的最后一门考试,可以愉快的写代码了~今天就来记录一下 我的下载器 中是如何实现限速的。
0x02 限速的对象
市面上常见的专业下载器都会提供下载/上传限速这个功能,那限速究竟是限的哪一个速度呢?
我们都知道HTTP/HTTPS的传输层协议是TCP,TCP是基于字节流的。字节流在 Java 中对应的就是 InputStream
和 OutputStream
。基于TCP的传输层下载/上传的步骤一般是
- 建立TCP连接,对应Java的
Socket.connect()
。这期间会经历三次握手,是一个耗时过程,可以使用连接复用优化(OKHttp
已经做了连接池缓存)。 - 连接成功后就可以根据需要收发数据,利用Socket获取到连接的
InputStream
和OutputStream
操作即可。 - 关闭连接。
以下载为例,首先连接步骤是不需要限速的,因为连接部分通常是很快的,并且往往都想要连接更加快速。所以,我们限速的对象肯定就是从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下载器之限速篇》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 百度不限速下载器 BND2 技术架构简介
- 百度网盘不限速下载 Chrome 插件 1.1.0 兼容苹果系统
- 关于nginx的限速模块
- 如何用Redis实现一个指定时间的限速器
- 微服务之服务治理:Envoy 全局 gRPC 限速服务 lyft/ratelimit 详解
- nft-qos 更新至 v1.2,修复外网上传速率限速失效的问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C# 6.0本质论
[美] Mark Michaelis(马克·米凯利斯)、[美] Eric Lippert(埃里克·利珀特) / 周靖、庞燕 / 人民邮电出版社 / 2017-2-1 / 108
这是C#领域中一部广受好评的名作,作者用一种易于理解的方式详细介绍了C#语言的各个方面。全书共有21章和4个附录(其中哟2个附录从网上下载),介绍了C#语言的数据类型、操作符、方法、类、接口、异常处理等基本概念,深入讨论了泛型、迭代器、反射、线程和互操作性等高级主题,还介绍了LINQ技术,以及与其相关的扩展方法、分部方法、Lambda表达式、标准查询操作符和查询表达式等内容。每章开头的“思维导图”......一起来看看 《C# 6.0本质论》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
UNIX 时间戳转换
UNIX 时间戳转换