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

首頁 > 編程 > .NET > 正文

使用.NET實現斷點續傳

2024-07-10 13:04:13
字體:
來源:轉載
供稿:網友

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

 

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

get /upload/200902/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

 

 jfif  h h  c [1]

….

 

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

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

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

 

get /upload/200902/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());

                     }

              }

 

以上是本人在開發中的一點小小體驗,希望能與大家分享! :)


  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 漯河市| 通渭县| 江都市| 嵩明县| 于田县| 达孜县| 梅州市| 鄂托克前旗| 红原县| 塔城市| 澄城县| 龙井市| 龙海市| 商城县| 凌云县| 黔东| 晋中市| 定陶县| 临澧县| 普安县| 岳池县| 淄博市| 富锦市| 安龙县| 沙河市| 潢川县| 武川县| 郧西县| 工布江达县| 广灵县| 琼中| 常宁市| 福安市| 青阳县| 依兰县| 华池县| 翼城县| 栖霞市| 吴忠市| 延津县| 井研县|