国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

上傳下載:在C#中實現斷點續傳

2023-05-12 12:29:37
字體:
來源:轉載
供稿:網友

本文較詳細的介紹了使用C#開發斷點續傳功能的方法,為我們在Visual C#中實現上傳文件功能提供了很好的解決方案。

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中的相關類

1、完成HTTP請求

System.Net.HttpWebRequest

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

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

2、完成文件訪問

System.IO.FileStream

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

代碼實現

代碼如下:

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());

} }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台中县| 怀集县| 武宣县| 遂川县| 新龙县| 马关县| 九江县| 庆云县| 保亭| 盱眙县| 沾益县| 东辽县| 吴旗县| 五寨县| 尼木县| 龙里县| 定日县| 水城县| 湟源县| 宾川县| 南阳市| 濉溪县| 张家界市| 郑州市| 兴海县| 嵊泗县| 比如县| 华宁县| 安多县| 西充县| 阜平县| 鹰潭市| 东海县| 大丰市| 古交市| 安国市| 天台县| 黄浦区| 曲水县| 仁怀市| 南部县|