我们从网络上下载文件时通常会使用浏览器或者迅雷这样的下载软件,他们大多具有高速下载(下载速度快),断点续传(可以暂停之后继续下载)等特性。现在假如我们自己开发的应用软件中也需要支持这些特性,我们该如何设计和实现了?本文主要围绕这一问题进行论述。
首先,我们将一个完善的文件下载库需要具有的特性列举出来:
- 多线程分片下载
- 断点续传
- 磁盘缓存
- 最高下载速率限制及实时下载速率反馈(可选)
- 多协议支持,跨平台(可选)
1. 多线程分片下载
Chrome浏览器和迅雷能实现高速下载的核心就是多线程分片下载(这里忽略迅雷的离线加速等技术),以HTTP协议为例,HTTP协议支持在请求头中指明需要请求数据的起始
和结束
位置。我们可以开启多个线程同时进行不同的HTTP请求,这些请求分别请求同一文件的不同位置,我们将每个HTTP请求的内容称为“片”
,在文件的所有片下载完成之后,我们再进行片的合并。
libcurl中可以通过如下方式指定请求文件的某一区域:
curl_easy_setopt