北大青鸟南京普雷

北大青鸟南京普雷

用户操作
[即时聊天] [发私信] [加为好友]
LI'JIEID:lwjjie
5203次访问,排名17608(2)好友1人,关注者3
喜爱编程
lwjjie的文章
原创 3 篇
翻译 0 篇
转载 34 篇
评论 5 篇
LI'JIE的公告
394044144                                                
最近评论
mldstk:wow power leveling
mldstk:wow power leveling
mjk2008:这是我自己做文件上传的经历,多多指教!
http://blog.csdn.net/mjk2008/archive/2008/06/05/2513109.aspx
xz_xq:我copy了ZL的代码至项目中,发现html中有引用两个js文件,所以目前运行是报js错误的,请ZL将js文件发给我,谢谢.xuqing0411@163.com
shaopingnj:我顶我顶,我狂顶!!!!!
文章分类
收藏
    相册
    南京北大青鸟
    南京北大青鸟
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 使用.NET实现断点续传收藏

    新一篇: 《高级语言(C语言)程序设计》教案 | 旧一篇: PetShop4.0 详解和水晶报表

     

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

                         }

                  }

     

    发表于 @ 2008年02月27日 13:45:00|评论(loading...)|编辑

    新一篇: 《高级语言(C语言)程序设计》教案 | 旧一篇: PetShop4.0 详解和水晶报表

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © LI'JIE