选择显示字体大小

使用.net实现断点续传

ivy_live521(原作)

断点续传的原理
在了解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

 

?? jfif  h h  ? c [1]

….

 

下面我们就来说说“断点续传”。

顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。在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 将发送到 inte.net 资源的公共 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());

                     }

              }

 

以上是本人在开发中的一点小小体验,希望能与大家分享! :)

 

注:本文未经许可,不得转载


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons