作为一名程序媛我也想快点进步,希望慢慢积累吧。给自己加加油。
1. 断点续传的必要性
大部分下载类的app,都会遇到网络不好的情况,如果下载到最后一步却下载失败了,是不是会让人很头疼。如果能重试下载从上次下载的文件位置继续下载,就显得很必要了。关乎用户体验问题。非常 非常重要!!!!!😂
2.了解断点续传之前,了解下http协议。
HTTP(Hyper Text Transfer Protocol)协议是用于从万维网(www)服务器传输超文本到本地浏览器的传送协议。它是基于TCP/IP协议来传递数据的。
HTTP请求由三部分组成:状态行、请求头、请求体。
先看一下客户端请求头的一个例子:
GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Range:bytes:500-900
Cache-Control: max-age=0
这里不详细展开,我们只讨论和断点续传有关的几个请求头属性。
1.Range: 只请求实体的一部分。比如:Range:bytes:500-900
2.Etag:请求实体的唯一标识符。(可以是文件md5) 比如:ETag: “737060cd8c284d8af7ad3082f209582d”
3.Last-Modified:最后资源的更改时间。用于服务器响应头 。如: Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
4.If-Range:如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag。 例子:If-Range: “737060cd8c284d8af7ad3082f209582d”
5.Content-Range:用于服务器响应头。记录服务器返回数据的范围及文件总大小。如:Content-Range: bytes 0-499/22400
6.If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码。 如:
If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
有的同学可能分不清楚是客户端的请求头还是服务器端的响应头,👇下面理一下: