(一)断点续传的原理 其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。7 z1 P, T$ S, b
打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:
, c6 p: ^3 ]9 _ 假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。
' N5 F; Y+ s8 V( u9 J" O1 F GET /down.zip HTTP/1.12 _$ f/ z/ N. j6 z
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-9 s" @$ b- i& P2 z
excel, application/msword, application/vnd.ms-powerpoint, */*
" `8 K" a+ v1 ^" f" b' `7 ^1 Q; J Accept-Language: zh-cn- `" e2 Q: I: Q; E8 I) r* V; v- w9 c8 U
Accept-Encoding: gzip, deflate
( d: k y: J) v N6 v User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
# E: S5 y' v0 M Connection: Keep-Alive
! P! u& f0 u8 H6 r. n 服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:6 F; E" E" F+ ]: y g, l
200# d T) ?' z+ z! N' U2 g1 q
Content-Length=106786028$ M# R& B0 D) O
Accept-Ranges=bytes
3 p- X. D- w/ j# n( y3 h" T# Z Date=Mon, 30 Apr 2001 12:56:11 GMT6 z% `5 g2 k7 X6 i7 B9 |
ETag=W/"02ca57e173c11:95b"
) b7 ~6 |& G: E: e) l1 ^9 Z5 x8 B Content-Type=application/octet-stream
& V6 v0 y: u* ]5 a5 d! e f Server=Microsoft-IIS/5.0 c; W' x; A; i# H
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT
3 R; r$ Q5 q- C2 W; `% A! Z* b 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给
0 e/ ^! m) P; E Web服务器的时候要多加一条信息--从哪里开始。
7 F# J1 L, h ?* c 下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。
! ^- v5 O8 G1 a& W GET /down.zip HTTP/1.0$ B6 {; d7 X7 b- B3 q
User-Agent: NetFox
* O7 e8 R3 I& r RANGE: bytes=2000070-; Z. ^, \6 n6 ^3 y' U
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
+ }( @9 _8 Q7 [. O/ G) U1 z 仔细看一下就会发现多了一行RANGE: bytes=2000070-5 p: F3 r$ s! Z" A: N
这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。
$ S9 i: c, k7 ~ p& q9 X 服务器收到这个请求以后,返回的信息如下:
0 w4 h8 l( z/ R3 G# o 206: \; z$ a) @4 p+ O, V
Content-Length=106786028
* C1 {2 Z4 ?4 v j$ V# R; b Content-Range=bytes 2000070-106786027/106786028
. `5 {' u! G- j q# k Date=Mon, 30 Apr 2001 12:55:20 GMT$ _$ \% K9 O6 W( h, i$ I
ETag=W/"02ca57e173c11:95b"- N$ k4 M) X5 `/ _: i/ ?, N" b
Content-Type=application/octet-stream5 Y1 W& E: V2 H; v/ M. r
Server=Microsoft-IIS/5.02 |: [, F7 N- U8 }* |2 u3 i
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
) {5 O2 ~3 h/ g 和前面服务器返回的信息比较一下,就会发现增加了一行:3 F" N2 l. x( c9 l" J. e! e
Content-Range=bytes 2000070-106786027/106786028
- n$ m# q" u4 L5 p" s+ g: n# F 返回的代码也改为206了,而不再是200了。
& w6 K0 H: }, ?* s( m2 X/ l- Q6 H 知道了以上原理,就可以进行断点续传的编程了。
2 e/ d2 |" Q, E0 S# x! ~% ~3 y% ~" f6 Z
|