C#断点续传原理与实现

在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种。请求协议是由客户机(浏览器)向服务器(WEB SERVER)提交请求时发送报文的协议。回复协议是由服务器(web server),向客户机(浏览器)回复报文时的协议。请求和回复协议都由头和体组成。头和体之间以一行空行为分隔。 

以下是一个请求报文与相应的回复报文的例子:
ExpandedBlockStart.gif代码
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  

 

下面我们就来说说"断点续传",顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。 
在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。  

比如说从第1024字节开始下载,请求报文如下:
ExpandedBlockStart.gif代码
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提供的相关的类,那么,我们就可以方便的实现了。 

代码如下:
ExpandedBlockStart.gif代码
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, 0512);
        
while (nReadSize > 0)
        {
            fs.Write(nbytes, 
0, nReadSize);
            nReadSize 
= ns.Read(nbytes, 0512);
        }
        fs.Close();
        ns.Close();
        Console.WriteLine(
"下载完成");
    }
    
catch (Exception ex)
    {
        fs.Close();
        Console.WriteLine(
"下载过程中出现错误:" + ex.ToString());
    }
}

 


转载于:https://www.cnblogs.com/qiantuwuliang/archive/2010/04/15/1712386.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET:使用 LinqSharp 简化复杂查询

LinqSharp 是个开源 LINQ 扩展库,它允许您编写简单代码来生成复杂查询,包括查询扩展和动态查询生成。LinqSharp.EFCore 是对 EntityFramework 的增强库,提供更多数据注解、数据库函数及自定义储存规则等。https://github.com/zmjack/LinqShar…

c#事件的发布-订阅模型_微信灰度测试订阅号付费功能,小米推出最便宜5G套餐,腾讯辟谣高管猝死赔钱事件,核心期刊发布十岁儿童文章,这就是今天的其他大新闻!...

今天是1月15日农历十二月廿一杭州又开始下雨了今天中午出个门我们这乡下打车排队能排到十几个。。。下面是今天的其他大新闻# 微信宣布:正灰度测试订阅号付费功能( IT之家 ) 1月15日消息,腾讯微信团队今日表示,目前微信灰度测试订阅号付费能力…

计算机组成原理第04章在线测试,计算机组成原理第四章单元测试(二)(含答案).docx...

PAGEPAGE 1第四章存储系统(二)测试书生1、32位处理器的最大虚拟地址空间为????A、2G????B、4G????C、8G????D、16G2、在虚存、内存之间进行地址变换时,功能部件 ( )将地址从虚拟(逻辑)地址空间映射到物理地址空间????A、TLB????B、MMU???…

据说这篇总结覆盖了一般Python开发面试中可能会问到的大部分问题

原文标题:一名python web后端开发工程师的面试总结先介绍下我的情况通信背景,工作一年多不到两年。之前一直在做C的MFC软件界面开发工作。公司为某不景气的国企研究所。(喏,我的工作经验很水:1是方向不对;2…

理解C#泛型运作原理

前言我们都知道泛型在C#的重要性,泛型是OOP语言中三大特征的多态的最重要的体现,几乎泛型撑起了整个.NET框架,在讲泛型之前,我们可以抛出一个问题,我们现在需要一个可扩容的数组类,且满足所有类型&#xff…

visio软件接口流程图_Microsoft Office Visio绘制系统框图以及流程图的操作步骤

最近很多朋友咨询关于Microsoft OfficeVisio如何绘制系统框图以及流程图的问题,今天的这篇教程就来聊一聊这个话题,希望可以帮助到有需要的朋友。Microsoft Office Visio绘制系统框图以及流程图的操作步骤我们先在桌面空白处或文件夹下,点击鼠…

游戏计算机的显示器,玩游戏用多大显示器好?聊聊电脑显示器多大尺寸合适

最近有多位网友在“电脑百事网”微信公众号中留言问到“显示器多大尺寸合适”、“玩游戏用多大显示器好”类似的相关问题。今天小编就来抽空解答一下,希望对有类似问题的网络朋友有所参考。电脑显示器多大尺寸合适Q:玩游戏用多大显示器好?A&a…

搭建基于域名的虚拟web主机

创建两个目录&#xff0c;分别存放accp和benet两个网站的网页文件<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />创建两个页面用以以后的测试因为我的主页写的是index.htm&#xff0c;在配置文件httpd.conf中没有这个引导页面&…

百度地图大数据告诉你一线城市真相

01 城市人口吸引力大PK&#xff01;2017年度城市人口吸引力指数排名▼划重点&#xff1a;1、第三列里的省会城市南昌、长春、乌鲁木齐、兰州、海口、呼和浩特、西宁是对人口的吸引力较弱。2、第二列里的贵阳、沈阳、哈尔滨、石家庄、福州、合肥、南宁、昆明对人口的吸引力尚可。…

微软开源Power Fx,基于Excel的低代码编程语言

喜欢就关注我们吧&#xff01;微软宣布推出新的开源编程语言 Power Fx&#xff0c;一种基于 Microsoft Excel 的低代码公式语言&#xff1b;将可以在整个 Microsoft Power Platform 中进行使用。该语言背后的动机是开发一些 Excel 用户熟悉的东西&#xff0c;以内容为中心而不是…

python浅拷贝_Python中的浅拷贝和深拷贝

本文翻译自copy in Python (Deep Copy and Shallow Copy)&#xff0c;讲述了在Python语言中浅拷贝与深拷贝的不同用法。全文系作者原创&#xff0c;仅供学习参考使用&#xff0c;转载授权请私信联系&#xff0c;否则将视为侵权行为。码字不易&#xff0c;感谢支持。以下为全文内…

常用计算机二级函数,计算机二级MS office常用函数

计算机二级MS office常用函数1、DAVERAGE用途&#xff1a;返回数据库或数据清单中满足指定条件的列中数值的平均值。语法&#xff1a;DAVERAGE(database&#xff0c;field&#xff0c;criteria)参数&#xff1a;Database 构成列表或数据库的单元格区域;Field指定函数所使用的数…

错误删除linux分区致Win7引导失败的修复方法

以前在Winxp和linux双启动时&#xff0c;若完全 删除了linux分区&#xff0c;重启进不了Winxp时&#xff0c;只需要用Winxp的光盘引导系统到命令行或故障恢复控制台&#xff0c;输入fixmbr和fixboot即可解决。现在是win7系统&#xff0c;命令行已经被修改。昨天我就遇到这问题&…

如何通过自学找到一份开发的工作?

01学习过程比较仔细的学习了《cprimer》&#xff0c;并对每个习题都自己写代码实现了一遍&#xff0c;包括稍微复杂一点的例子。认真读完了《effective c》&#xff0c;《effective stl》。比较仔细的学完了《数据结构与算法分析》&#xff0c;并把其中的每种数据结构和算法都用…

BeetleX使用bootstrap5开发SPA应用

在早期版本BeetleX.WebFamily只提供了vuejselement的集成&#xff0c;由于element只适合PC管理应用开发相对于移动应用适配则没这么方便。在新版本组件集成了bootstrap5可以更好地适配移动Web应用&#xff1b;同时也集成了Fontawesome和bootstrapIcons,这样在开发过程中使用字体…

计算机基础知识菜鸟教程,机器学习基础知识整理归纳

关于机器学习的一些基本概念的整理1.前言1.机器学习是一门致力于研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能的学科。1997年Mitchell给出一个更形式化的定义&#xff0c;假设用P来评估计算机程序在某任务类T上的性能&#xff0c;若一个程序通过利用经验E在…

python echo函数_python如何调用php文件中的函数详解

前言python调用php代码实现思路&#xff1a;php文件可通过在terminal中使用php命令行进行调用&#xff0c;因此可使用python开启子进程执行命令行代码。函数所需的参数可通过命令行传递。测试环境1、操作系统&#xff1a;macos10.13.22、php版本&#xff1a;PHP 7.1.7(mac自带)…

今天换了ubuntu10.04

今天换成了ubuntu10.04&#xff0c;开机很快&#xff0c;17秒到登录界面&#xff0c;在我这台dell vostro 1500上很快很快了。快是ubuntu10.04给我的第一印象。至于界面什么的&#xff0c;我真觉得没什么区别&#xff0c;反正我也不开特效&#xff0c;管它呢&#xff01;反正我…

Jupyter 常见可视化框架的选择

文末有福利&#xff01;对于以Python作为技术栈的数据科学工作者&#xff0c;Jupyter是不得不提的数据报告工具。可能对于R社区而言&#xff0c;鼎鼎大名的ggplot2是常见的可视化框架&#xff0c;而大家对于Python&#xff0c;以及Jupyter为核心的交互式报告的可个视化方案就并…

AOP(面向切面编程)大概了解一下

前言上一篇在聊MemoryCache的时候&#xff0c;用到了Autofac提供的拦截器进行面向切面编程&#xff0c;很明显能体会到其优势&#xff0c;既然涉及到了&#xff0c;那就趁热打铁&#xff0c;一起来探探面向切面编程。正文1. 概述在软件业&#xff0c;AOP为Aspect Oriented Prog…