使用.NET實現斷點續傳
斷點續傳的原理
在了解HTTP斷點續傳的原理之前,先來說說HTTP協議,HTTP協議是一種基於tcp的簡單協議,分為請求和回複兩種。請求協議是由客戶機(瀏覽器)向服務器(WEBSERVER)提交請求時發送報文的協議。回複協議是由服務器(webserver),向客戶機(瀏覽器)回複報文時的協議。請求和回複協議都由頭和體組成。頭和體之間以一行空行為分隔。
以下是一個請求報文與相應的回複報文的例子:
GET/image/index_r4_c1.jpgHTTP/1.1
Accept:*/*
Referer:
Content-Length:2827
?JFIFHHC[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