斷點續傳是大型文件數據傳輸的核心。本文將以多線程技術和Socket技術爲依託,介紹大型文件斷點續傳的實現方法。
基本實現思想
多線程斷點續傳實現的基本思想就是在發送端(也稱客戶端)將要傳輸的文件分割爲大小相當的多塊,用多個線程,將這些塊同時向目標服務器端發送;在服務器端的服務程序監聽數據傳輸請求,每當接到新的請求,則創建一個新的線程,與客戶端的發送線程對應,接收數據,記錄數據傳輸進程
圖1是點對點文件斷點續傳第N塊傳輸過程示意圖。在傳輸發起端(客戶端),將大型文件事先分割爲大小相當的N塊,同時創建N個傳輸線程,連接目標端服務器。當服務器端接收到每一個連接請求後,告知客戶端可以傳輸文件。當客戶端接收到可以傳輸文件的消息時,首先向服務器發送數據傳輸信息塊(包括第幾塊、在塊中的起始位置)請求,當服務器端接收到該請求後,向客戶端發送數據傳輸信息,客戶端然後傳輸數據傳輸信息塊指定的數據給服務器端,服務器端更新數據傳輸信息塊。
(一)斷點續傳的原理
其實斷點續傳的原理很簡單,就是在Http的請求上和一般的下載有所不同而已。
打個比方,瀏覽器請求服務器上的一個文時,所發出的請求如下:
假設服務器域名爲wwww.sjtu.edu.cn,文件名爲down.zip。
GET /down.zip HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Connection: Keep-Alive
服務器收到請求後,按要求尋找請求的文件,提取文件的信息,然後返回給瀏覽器,返回信息如下:
200
Content-Length=106786028
Accept-Ranges=bytes
Date=Mon, 30 Apr 2001 12:56:11 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT
所謂斷點續傳,也就是要從文件已經下載的地方開始繼續下載。所以在客戶端瀏覽器傳給
Web服務器的時候要多加一條信息--從哪裏開始。
下面是用自己編的一個"瀏覽器"來傳遞請求信息給Web服務器,要求從2000070字節開始。
GET /down.zip HTTP/1.0
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
仔細看一下就會發現多了一行RANGE: bytes=2000070-
這一行的意思就是告訴服務器down.zip這個文件從2000070字節開始傳,前面的字節不用傳了。
服務器收到這個請求以後,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
和前面服務器返回的信息比較一下,就會發現增加了一行:
Content-Range=bytes 2000070-106786027/106786028
返回的代碼也改爲206了,而不再是200了。
知道了以上原理,就可以進行斷點續傳的編程了。
斷點續傳原理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.