這次想來講講斷點續傳,以前沒相關需求,所以一直沒去接觸,近階段了解了之後,其實並不複雜,那麼也便來寫一篇記錄一下,分享給大夥,也方便自己後續查閱。
講之前,先來通俗的解釋下什麼是斷點續傳:
既然如此,那麼要實現斷點續傳的關鍵點其實也就是兩點:
如何知道客戶端想要的指定位置是多少
是吧,理論上來講,當這兩點都可以做到的時候,自然就可以實現斷點續傳了。那麼,要如何做到呢?
range & content-length & content-range & if-range
這些都是 http 包中 header 頭部的一些字段資訊,其中 range 和 if-range 是請求頭中的字段,content-length 和 content-range 是響應頭中的字段。
格式含義
range:bytes=0-500
range:bytes=501-1000
range:bytes=-500
range:bytes=500-
那麼,此時,就可以使用range:bytes=501-1000
這種格式了,每個執行緒在各自的請求頭字段中,以這種格式加入相對應的資訊即可達到目的了。
content-range:bytes 501-1000/2000
這時就可以結合 if-range 欄位來實現了,這個也是在請求頭中的字段,跟 range 字段一起使用,它的作用是給 range 字段生效設定了一些條件,只有滿足這些條件,range 才能生效。
也就是說,只有先滿足 if-range,那麼才能通過 range 來實現斷點續傳。
那它的條件值可以設定為哪些呢?有兩種,last-modified 或者 etag,這兩個也都是響應頭中的字段。
具體可以參考這篇文章:mdn if-range
以上就是斷點續傳相關的理論基礎,下面抓個包,看看請求頭和響應頭中的資訊,來總結一下理論基礎。
響應頭中返回了這部分的內容,並在 content-length 和 content-range 欄位中給出了相關資訊。
理論基礎掌握了,那麼下面就是來看看**怎麼實現。不管用什麼語言,使用了什麼網路框架,要寫的**都有兩個部分:
檔案處理操作有兩個關鍵點,一是獲取檔案大小,二是以追加的方式寫檔案。新增請求頭的操作則是參考各自網路框架的指示即可。
下面介紹了三種示例,分別是 c++&libcurl,android&httpurlconnection,android&okhttp。&前面是語言,後面是所使用的網路框架。
//引入libcurl庫
#include #pragma comment(lib,"libcurl.lib")
//檔案操作庫
curl_off_t getlocalfilelength()
else }
double getdownloadfilelength()
else
rel = downloadfilelenth;
curl_easy_cleanup(handle);
return rel;
}curlcode downloadinternal()
curl_easy_cleanup(mhandler);
return curle_failed_init;
}
由於最近都在忙 c++ 的專案了,android 暫時還沒時間自己寫個 demo 測試一下,所以先給幾篇網上找的鏈結占個坑,後續抽個時間自己再來寫個 demo。 HTTP 斷點續傳
客戶端請求域 range 格式如下例子 第乙個500位元組 位元組偏移量0 499,包括0和499 range bytes 0 499 第二個500位元組 位元組偏移量500 999,包括500和999 range bytes 500 999 最後500位元組 位元組偏移量9500 9999,包括9...
IOS斷點續傳
asihttprequest可以實現斷點續傳。網上有一些介紹類似使用 request setallowresumeforfiledownloads yes 不過,通過asihttprequest的非同步請求以及delegate還是可以實現斷點續傳的。本文還是以grails編寫斷點續傳伺服器端為例。非...
linux斷點續傳
在linux伺服器上經常要用scp傳輸大檔案,可能由於網路等原因出現間接性中斷,導致傳輸一半的檔案突然中斷。其實scp是可以續傳的,它需要rsync以及它的ssh協議 舉例如下 rsync p rsh ssh home.tar 192.168.205.34 home home.tar,再輸出密碼後,...