多线程断点下载

本文介绍了多线程断点续传在下载中的应用,重点解析了HTTP范围请求的工作原理,包括Range、Accept-Ranges、Content-Range和Content-Length等关键头部字段。同时,讨论了服务端如何支持范围请求,测试方法以及自定义Servlet的改进,最后简要提及客户端实现多线程断点下载的关键API。
摘要由CSDN通过智能技术生成

多线程断点续传可以应用在上传和下载两个方面,好的上传或者下载案例,都是要求能够 “多线程 + 断点续传 + 进度条显示”。本篇是下载篇,主要是面向服务端程序员阐述原理。
做服务端开发或者web开发的同学,相比于安卓、IOS开发的同学,对于这个概念会比较陌生,因为web只能使用浏览器上传和下载,可编程性不高,客户端具体的上传和下载过程是个黑盒,比如下载过程到底是不是多线程,是不是支持断点续传,程序员都不用怎么关心。而安卓或者IOS的开发,客户端上传下载都是自己去面向服务端接口,自己读取本地IO流输出到服务端(上传),自己读取服务端IO流存储到本地(下载),比如关于下载的多线程、断点续传、进度条显示就需要程序员自己去考虑。


概述


试想一下,下载一个1000MB甚至更大的文件,我们可以从哪些角度去提升下载的体验呢?
1.缩短整个下载时间;
2.可以任意暂停开始,并且网络不稳定断开或者服务端超时断开,用户下一次不用重头开始下载;
3.下载进度显示。

问题1,可以从很多方面来考虑,除了提升网络带宽,一个有效的方案就是客户端多线程了,试想这样一个场景:客户端下载某一个服务端的1000MB的资源文件,这个服务端对外流量的输出有速率限制,限速策略是针对每个请求设置最大速率128KB/S。这时客户端的多线程就特别有效,如果客户端带宽充分,n个线程分段请求的速率就是n*128kb/s。


问题2,第一次客户端下载了500MB的临时文件,第二次请求500-999即可,这就是所谓的断点续传;

问题3,就更简单了,用当前下载大小/文件总大小就得到了进度。
如上针对问题1、2的方案就是多线程断点下载


http范围请求


多线程断点下载的核心原理就是依赖http协议的范围请求,从上述的方案分析,可以明显看出无论是多线程还是断点续传,都要求能够通过http协议访问某一段资源,这种范围请求是依靠一系列相对陌生的请求、响应消息头支持的。


1.Range:范围请求主要是通过Range消息头指定请求资源的字节范围,比如,上图表示请求[5000, 9999]字节。如果服务端不支持Range,则返回200 OK和全部资源;如果支持Range,则返回206 Partial Content和区间范围[5000, 9999]的资源,以及Accept-Range、Content-Range、Content-Length字段
2.Accept-Ranges:用来告诉客户端是否能处理范围请求,可指定的字段值有两种,可处理范围请求时指定其为bytes,反之指定其为none
3.Content-Range:5000-9999表示返回的实体资源的字节区间,10000表示资源的总大小。
4.Content-Length:实际返回的片段的大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值