您现在的位置: 军旅同心 >> 读书赏析 >> 学习园地 >> 电脑网络 >> 技术文章 >> 文章正文
使用.NET实现断点续传
作者:采集员 文章来源:来源于网络 点击数: 更新时间:2005-9-10 14:22:27

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 将发送到 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());

        &nb

[1] [2] 下一页


 
免责声明:作品版权归所属媒体与作者所有!!本站刊载此文不代表同意其说法或描述,仅为提供更多信息。如果您认为我们侵犯了您的版权,请告知!本站立即删除。有异议请联系我们。
文章录入:烟灰缸    责任编辑:烟灰缸 
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 |