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

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

其实断点续传,众多技术都可以实现,只是想难易程度而以。经过比较分析发现,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";


        //本地构造文件流
        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];

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

        //获取网络流
        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.ncmem.com/wordpress/2023/11/13/c%e5%ae%9e%e7%8e%b0http%e5%8d%8f%e8%ae%ae%e4%b8%8b%e8%bd%bd%e7%9a%84%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/
欢迎入群一起讨论

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值