閱讀900 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用.NET實現斷點續傳

斷點續傳的原理
在了解HTTP斷點續傳的原理之前,先來說說HTTP協議,HTTP協議是一種基於tcp的簡單協議,分為請求和回複兩種。請求協議是由客戶機(瀏覽器)向服務器(WEBSERVER)提交請求時發送報文的協議。回複協議是由服務器(webserver),向客戶機(瀏覽器)回複報文時的協議。請求和回複協議都由頭和體組成。頭和體之間以一行空行為分隔。

以下是一個請求報文與相應的回複報文的例子:

GET/image/index_r4_c1.jpgHTTP/1.1

Accept:*/*

Referer:

Content-Length:2827

?JFIFHHC[1]

….

下麵我們就來說說“斷點續傳”。

顧名思義,斷點續傳就是在上一次下載時斷開的位置開始繼續下載。在HTTP協議中,可以在請求報文頭中加入Range段,來表示客戶機希望從何處繼續下載。

比如說從第1024字節開始下載,請求報文如下:

GET/image/index_r4_c1.jpgHTTP/1.1

Accept:*/*

Referer:

stringStrUrl="

//打開上次下載的文件或新建文件

longlStartPos=0;

System.IO.FileStreamfs;

if(System.IO.File.Exists(StrFileName))

{

fs=System.IO.File.OpenWrite(StrFileName);

lStartPos=fs.Length;

fs.Seek(lStartPos,System.IO.SeekOrigin.Current);//移動文件流中的當前指針

}

else

{

fs=newSystem.IO.FileStream(StrFileName,System.IO.FileMode.Create);

lStartPos=0;

}

//打開網絡連接

try

{

System.Net.HttpWebRequestrequest=(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);

if(lStartPos>0)

request.AddRange((int)lStartPos);//設置Range值

//向服務器請求,獲得服務器回應數據流

System.IO.Streamns=request.GetResponse().GetResponseStream();

byte[]nbytes=newbyte[512];

intnReadSize=0;

nReadSize=ns.Read(nbytes,0,512);

while(nReadSize>0)

{

fs.Write(nbytes,0,nReadSize);

nReadSize=ns.Read(nbytes,0,512);

}

fs.Close();

ns.Close();

Console.WriteLine("下載完成");

}

catch(Exceptionex)

{

fs.Close();

Console.WriteLine("下載過程中出現錯誤:"+ex.ToString());

}

}

最後更新:2017-04-02 00:06:33

  上一篇:go 設計ASP.NET應用程序的七大絕招
  下一篇:go 使用更精簡的代碼保證ASP.NET應用程序的安全