接上一篇文章
上一篇文章重点阐述了文件下载管理器的多线程管理部分的内容,这篇文章解决单个文件下载断点续传的实现。
断点续传下载文件
文件下载流程
针对文件下载,要保证准确性和高效,设计了如下的流程
本文并不涉及解压文件
,只是抛砖引玉,有需求读者自行修改
网络选型
TIP:为什么选HttpWebRequest
?
Unity提供了
WWW
和UnityWebRequest
的网络解决方案,但两者都是基于协程(或者说unity主进程),并不适用于线程下运行。所以我们能用的只有C#原生的HttpWebRequest
,网上对HttpWebRequest
的解析很多了,就不大篇幅阐述了。
由于整个下载流程都在线程中,那么直接使用的就是HttpWebRequest
的同步接口(阻塞),等待结果返回。
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
HttpWebResponse respone = (HttpWebResponse)request.GetResponse();
Stream ns = respone.GetResponseStream();
int readSize = ns.Read(bytes, 0, oneReadLen); // 读取第一份数据
使用同步接口(阻塞),一定要设置超时机制,否则默认的超时机制要么超长要么不起效。
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Timeout = TimeOutWait;
request.ReadWriteTimeout = ReadWriteTimeOut;
断点续传下载逻辑
断点续传有多种方式实现,比如迅雷的下载,是将大文件切成4MB的块,然后不同线程(p2p)下载对应块,然后所有块下载完成,校验一下,整个大文件就下载完成了。
而这里涉及的场景,是对单一路径(CDN)的下载,并不需要那么复杂的逻辑,只需要的是一个可以继续下载的功能。
下载逻辑如下图: