C#实现http协议下载的断点续传

咱们寄但愿于万能的解决方案,可是现实的状况老是很糟糕。在软件编程的世界中,技术分散的状况尤其严重,且不说各类语言拥有的优点不能融合,单就一 门语言而言,就拥有众多的技术和相关技术须要学习。网络编程就是这种状况,tcp、udp、http和soap相关的协议(ftp不会玩),咱们不得不在 同一个应用中使用不一样难以整合的技术。tcp讲究精准,udp讲究性能,http对于穿越外网有这自然的优点,soap对于讲究编程模型的人来讲是福音。html

    其实断点续传,众多技术均可以实现,只是想难易程度而以。通过比较分析发现,http对于断点下载比较容易实现,它最成功的地方在于,不须要服务端的实现,只需将须要下载的文件放置在iis服务器中便可。编程

下面我会根据下面一段代码分析http协议的数组

         /// <summary>
        /// 下载方法
        /// </summary>
        /// <param name="uri">下载地址的URI</param>
        public void DownLoad(object obj)
        {服务器

            //好比uri=http://localhost/Rabom/1.rar;iis就须要本身配置了。
            string uri = obj.ToString();
            //截取文件名
            string fileName = uri.Substring(uri.LastIndexOf(@"/") + 1);网络

            //构造文件彻底限定名,准备将网络流下载为本地文件
            string fileFullName = Application.StartupPath + @"\download\" + fileName;
            //构造文件的配置文件的彻底彻底限定名
            string fileCfgName = Application.StartupPath + @"\download\" + fileName+".cfg";tcp


            //本地构造文件流
            FileStream fs;
            //本地配置文件流
            FileStream fsCfg;性能

            if (File.Exists(fileFullName))
            {
                //若是存在配置文件,则继续下载
                if (File.Exists(fileCfgName))
                {
                    fs = new FileStream(fileFullName, FileMode.Append, FileAccess.Write, FileShare.Write);
                    fsCfg = fs = new FileStream(fileFullName, FileMode.Append, FileAccess.Write, FileShare.Write);
                }
                else
                {
                    return;//暂且这样
                }
            }
            else
            {
                fs = new FileStream(fileFullName, FileMode.Create);
                fsCfg = new FileStream(fileCfgName, FileMode.Create);
            }学习

            //开辟内存空间
            byte[] buffer = new byte[512];spa

            //请求地址
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
            //请求开始位置
            request.AddRange((int)fs.Length);htm

            //获取网络流
            Stream ns = request.GetResponse().GetResponseStream();

            //获取文件实际长度
            long contentLength = request.GetResponse().ContentLength;
            //获取文件读取到的长度
            int length = ns.Read(buffer, 0, buffer.Length);

            while (length > 0)
            {   

                //将字节数组写入流
                fs.Write(buffer, 0, buffer.Length);

                //继续下载
                buffer = new byte[512];
                length = ns.Read(buffer, 0, buffer.Length);
            }

            ns.Close();
            fs.Close();
            fsCfg.Close();

     }

   在上面的代码中,比较重要的就是类HttpWebRequest,这个类封装了http协议访问网络资源的方法,与WebClient不一样的是,HttpWebRequest容许咱们使用网络流的方式进行下载,咱们经过URI建立一个网络

流,咱们就能够开始获取咱们须要的数据了。在http协议的报文中,会进行详细的描述,固然描述的内容

不少,HttpWebRequest都帮咱们作了,说点题外话,http协议会将咱们计算机环境写进报文,其中包括计算机

名,计算机所在的ip地址。固然也包括咱们所讲的断点下载的关键报文Range,这个报文就是咱们须要开始下载文件的起始位置,这样咱们就能够根据本地文件已经下载了多少,为断点下载时所要求的起始位置提供依据。

本地文件刚建立的时候,fs.Lenght为0因此咱们在iis服务器上请求的网络流的游标是在流的起始位置,

当咱们中止下载后,再度下载该资源的时候,网络流的游标位置会根据range的值设置到相应的位置,这样咱们就能够断点下载了。

   若是你是网络编程的新手,那么本文的内容不适合你,由于文中涉及大量的网络编程的概念,你须要去一一掌握而后才能理解本文;若是你是有网络编程的经验,并且不知道这种断点下载的方式,那么我相信你必定学到了!

文章来源:http://blog.sina.com.cn/s/blog_62b0d0ef0100mnmj.html

相关文章
相关标签/搜索