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

首頁 > 編程 > .NET > 正文

使用.NET實現斷點續傳(HTTP)

2024-07-10 12:57:48
字體:
來源:轉載
供稿:網友
使用.net實現斷點續傳



join_gu



斷點續傳的原理
在了解http斷點續傳的原理之前,先來說說http協議,http協議是一種基于tcp的簡單協議,分為請求和回復兩種。請求協議是由客戶機(瀏覽器)向服務器(web server)提交請求時發送報文的協議。回復協議是由服務器(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());

}

}



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



注:本文未經許可,不得轉載

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深泽县| 临清市| 南充市| 庐江县| 双流县| 都兰县| 高台县| 余庆县| 凌源市| 莱阳市| 东光县| 卢湾区| 阳东县| 连州市| 镇江市| 庄河市| 巨鹿县| 沂源县| 家居| 共和县| 高清| 浙江省| 屏南县| 深水埗区| 宝应县| 永寿县| 正宁县| 白朗县| 芜湖市| 淳化县| 太白县| 正定县| 东方市| 龙里县| 梧州市| 施甸县| 宿州市| 肇源县| 洞口县| 边坝县| 山西省|