日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#断点续传原理与实现

發布時間:2023/12/4 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#断点续传原理与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在了解HTTP斷點續傳的原理之前,讓我們先來了解一下HTTP協議,HTTP協議是一種基于tcp的簡單協議,分為請求和回復兩種。請求協議是由客戶機(瀏覽器)向服務器(WEB?SERVER)提交請求時發送報文的協議。回復協議是由服務器(web?server),向客戶機(瀏覽器)回復報文時的協議。請求和回復協議都由頭和體組成。頭和體之間以一行空行為分隔。?

以下是一個請求報文與相應的回復報文的例子:
代碼 GET?/image/index_r4_c1.jpg?HTTP/1.1??
Accept:?*/*??
Referer:?http://192.168.3.120:8080??
Accept-Language:?zh-cn??
Accept-Encoding:?gzip,?deflate??
User-Agent:?Mozilla/4.0?(compatible;?MSIE?6.0;?Windows?NT?5.0;?.NET?CLR?1.0.3705)??
Host:?192.168.3.120:8080??
Connection:?Keep-Alive??

HTTP/1.1?200?OK??
Server:?Microsoft-IIS/5.0??
Date:?Tue,?24?Jun?2003?05:39:40?GMT??
Content-Type:?image/jpeg??
Accept-Ranges:?bytes??
Last-Modified:?Thu,?23?May?2002?03:05:40?GMT??
ETag:?"bec48eb862c21:934"??
Content-Length:?2827??

?

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

比如說從第1024字節開始下載,請求報文如下:
代碼 GET?/image/index_r4_c1.jpg?HTTP/1.1??
Accept:?*/*??
Referer:?http://192.168.3.120:8080??
Accept-Language:?zh-cn??
Accept-Encoding:?gzip,?deflate??
User-Agent:?Mozilla/4.0?(compatible;?MSIE?6.0;?Windows?NT?5.0;?.NET?CLR?1.0.3705)??
Host:?192.168.3.120:8080??
Range:bytes=1024-??
Connection:?Keep-Alive

?

.NET中的相關類?

明白了上面的原理,那么,我們來看看.NET?FRAMEWORK中為我們提供了哪些類可以來做這些事。?


完成HTTP請求?System.Net.HttpWebRequest?

HttpWebRequest?類對?WebRequest?中定義的屬性和方法提供支持,也對使用戶能夠直接與使用?HTTP?的服務器交互的附加屬性和方法提供支持。?

HttpWebRequest?將發送到?Internet?資源的公共?HTTP?標頭值公開為屬性,由方法或系統設置。下表包含完整列表。可以將?Headers?屬性中的其他標頭設置為名稱/值對。但是注意,某些公共標頭被視為受限制的,它們或者直接由?API公開,或者受到系統保護,不能被更改。Range也屬于被保護之列,不過,.NET為開發者提供了更方便的操作,就是?AddRange方法,向請求添加從請求數據的開始處或結束處的特定范圍的字節范圍標頭?


完成文件訪問?System.IO.FileStream?

FileStream?對象支持使用Seek方法對文件進行隨機訪問,?Seek?允許將讀取/寫入位置移動到文件中的任意位置。這是通過字節偏移參考點參數完成的。字節偏移量是相對于查找參考點而言的,該參考點可以是基礎文件的開始、當前位置或結尾,分別由SeekOrigin類的三個屬性表示。?


代碼實現?

了解了.NET提供的相關的類,那么,我們就可以方便的實現了。?

代碼如下:
代碼 static?void?Main(string[]?args)
{

????
string?StrFileName?=?"c:\\aa.zip";?//根據實際情況設置?
????string?StrUrl?=?"http://www.xxxx.cn/xxxxx.zip";?//根據實際情況設置?

????
//打開上次下載的文件或新建文件?
????long?lStartPos?=?0;
????System.IO.FileStream?fs;
????
if?(System.IO.File.Exists(StrFileName))
????{
????????fs?
=?System.IO.File.OpenWrite(StrFileName);
????????lStartPos?
=?fs.Length;
????????fs.Seek(lStartPos,?System.IO.SeekOrigin.Current);?
//移動文件流中的當前指針?
????}
????
else
????{
????????fs?
=?new?System.IO.FileStream(StrFileName,?System.IO.FileMode.Create);
????????lStartPos?
=?0;
????}

????
//打開網絡連接?
????try
????{
????????System.Net.HttpWebRequest?request?
=?(System.Net.HttpWebRequest)?System.Net.HttpWebRequest.Create(StrUrl);
????????
if?(lStartPos?>?0)
????????????request.AddRange((
int)?lStartPos);?//設置Range值?

????????
//向服務器請求,獲得服務器回應數據流?
????????System.IO.Stream?ns?=?request.GetResponse().GetResponseStream();

????????
byte[]?nbytes?=?new?byte[512];
????????
int?nReadSize?=?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?(Exception?ex)
????{
????????fs.Close();
????????Console.WriteLine(
"下載過程中出現錯誤:"?+?ex.ToString());
????}
}

?


轉載于:https://www.cnblogs.com/qiantuwuliang/archive/2010/04/15/1712386.html

總結

以上是生活随笔為你收集整理的C#断点续传原理与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。