講講斷點續傳那點兒事

2022-03-29 14:43:02 字數 1854 閱讀 2475

這次想來講講斷點續傳,以前沒相關需求,所以一直沒去接觸,近階段了解了之後,其實並不複雜,那麼也便來寫一篇記錄一下,分享給大夥,也方便自己後續查閱。

講之前,先來通俗的解釋下什麼是斷點續傳

既然如此,那麼要實現斷點續傳的關鍵點其實也就是兩點:

如何知道客戶端想要的指定位置是多少

是吧,理論上來講,當這兩點都可以做到的時候,自然就可以實現斷點續傳了。那麼,要如何做到呢?

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,再輸出密碼後,...