三级课题网络下载工具箱.docx
- 文档编号:17991446
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:48
- 大小:152.62KB
三级课题网络下载工具箱.docx
《三级课题网络下载工具箱.docx》由会员分享,可在线阅读,更多相关《三级课题网络下载工具箱.docx(48页珍藏版)》请在冰点文库上搜索。
三级课题网络下载工具箱
三级实践课题设计任务书
姓名
专业
题目
下载工具箱
设
计
任
务
设计一个比较简单基迅雷的下载工具,包括下载网页,歌曲等小容量资源,为用户提供一个方便快捷的下载工具。
主要功能包括:
1.实现支持HTTP协议下载;
2.实现多线程下载;
3.实现断点续传的功能;
4.当前下载速度测试
设计工具:
VisualC#.NET。
时
间
进
度
第1周(12-02-20~12-02-26):
按照老师的指导,进行系统的需求分析,总体设计和算法设计;
第2周(12-02-27~12-03-04):
根据总体设计方案和详细设计进行界面设计,模块设计,编写代码,对系统进行调试和改错;
第3周(12-03-05~12-03-09):
进行最后阶段的整理,编写课题文档总结报告。
原主
始要
资参
料考
与文
献
[1]C#程序设计教程李春葆谭成予金晶编著清华大学出版社2001.08;
[2]C#网络应用编程(第二版)马骏主编人民邮电出版社2000.12;
[03]C#程序设计[M],李乃文、傅游清华大学出版社.2005.2。
指导教师签字:
2012年0月0日
摘要
本文介绍了网络下载软件中的最新技术——多线程下载和断点续传技术及流量限制,批量导入(多任务下载),HTTP是超文本传输协议(HpyerTextTransferProtocol)的缩写,同时也介绍HTTP协议的发展、特点以及HTTP编程技术。
最后在这些技术的基础上成功设计并实现了基于HTTP协议的具有多线程下载、断点续传、流量限制功能的下载软件。
本软件的实现代码使用了通常的System.NET命名空间下的WebRequest和WebResponse类,可以实现多线程下载。
通过WebResquest和WebResponse可以实现高级的网络编程,可以用于处理客户端程序同Web服务器之间的HTTP通信,逐步解析HTTP协议来完成会话和文件下载等功能。
利用多线程功能请求URI资源,最终使得下载速度有所提高。
关键词:
下载;多线程;断点续传;HTTP。
目录
摘要I
第1章项目分析1
1.1问题描述2
1.2技术分析2
1.2.1创建TCP套接字连接2
1.2.2发送HTTP请求报文3
1.2.3接收HTTP应答报文3
1.2.4关闭TCP套接字连接4
第2章数据分析与算法的实现5
2.1多线程及同步异步5
2.2什么是断点续传技术5
2.3算法实现5
2.3.1多线程接收文件5
2.3.2断点续传算法的实现6
2.4多线程设计7
第3章Http下载功能实现8
3.1基本结构模块8
3.1.3代码分析及介绍8
3.2断点续传10
3.2.1流程图10
3.2.2代码11
3.3合并文件12
3.4窗体中的控件随着窗体的变化而变化13
3.4.1窗体控件变化前后图13
3.4.2代码介绍14
第4章结束语18
第1章项目分析
从互联网上下载文件,利用一些网络下载工具,例如:
迅雷、网络蚂蚁等,可以大大的加快文件的下载,其方便性和快速性给我们的工作和生活带类的很多的益处。
最近几年,随着计算机网络的飞速发展,因特网(Internet)已经逐渐成为人们生活、工作、学习必不可缺的一部分。
因特网上存储了大量丰富的信息资源,我们可以使用下载工具,把需要的信息资源下载到本地。
但是由于受到各种因素的限制,例如服务器性能、网络带宽、下载的信息量以及下载工具等等,下载速度受到不同程度的影响。
因此人们不断地提高服务器性能,扩展网络带宽,开发效率更高的下载工具以达到最大化提高下载速度的目的。
早期人们共享资源的普遍方法是将资源文件上传至服务器上,然后其他用户可以通过HTTP或FTP等协议将其下载到本地电脑。
这种模式称为客户机/服务器模式即C/S模式,它对服务器的依赖性很大,当下载用户很少时,比如说一个,他将独享服务器的带宽,很显然其下载速度会非常快。
然而当下载的人数较多而服务器带宽有限时,比如服务器带宽为3MB/S,而下载人数为100人,则众多下载用户不得不共享一个带宽(3MB/S)最终结果是下载速度均分(30KB/S),普遍不高。
纵观网络下载技术发展的历史,可以将其划分为四个阶段:
单线程下载阶段、多线程下载及断点续传阶段、P2P阶段、P2SP阶段。
单线下载时代:
应对有限时间流量的办法。
断点续传与多线程下载时代:
大幅度提高速度。
进入Windows与WWW(WorldWideWeb,互联网)时代之后,IE,Netscape等浏览器都可以通过点击左键下载,那个时候网络速度最快不过5KB/s,下载一首5MB的MP3歌曲要15分钟以上!
中途万一断线就前功尽弃,于是有人开发了支持断点续传的下载软件。
最早出现的多线程下载软件是中国人开发的NetAnts(网络蚂蚁)。
网络蚂蚁其实也是一个断点续传软件,但它对断点续传功能进行了扩展:
可进行多点续传,即利用断点续传的原理同时建立多个连接下载同一个软件并最终将其合并为一个完整的软件。
为了解决下载慢,采用先进的多线程技术,为了解决网络断开必须重新开始下载问题,采用了断电续传,以后人们不用为此而苦恼,不用在等好长时间下载一首歌曲,也不用再重新开始下载啦。
纵观网络下载技术发展的历史,可以将其划分为四个阶段:
单线程下载阶段、多线程下载及断点续传阶段、P2P阶段、P2SP阶段。
单线下载时代:
应对有限时间流量的办法;断点续传与多线程下载时代:
大幅度提高速度进入Windows与WWW(WorldWideWeb,互联网)时代之后,IE,Netscape等浏览器都可以通过点击左键下载,那个时候网络速度最快不过5KB/s,下载一首5MB的MP3歌曲要15分钟以上!
最早出现的多线程下载软件是中国人开发的NetAnts(网络蚂蚁)。
网络蚂蚁其实也是一个断点续传软件,但它对断点续传功能进行了扩展:
可进行多点续传,即利用断点续传的原理同时建立多个连接下载同一个软件并最终将其合并为一个完整的软件;P2P时代:
下载再也不怕人多挤破服务器;最早的P2P网络当属1979年的FidoNet(惠多网)和1984年的Usenet,经过不断发展,才有了现在人们常用的“BT”,“电驴”等P2P软件。
这类软件应用了P2P(Peer-to-Peer)技术,能够最大限度地利用网络带宽。
如今,BitComet、BitTorrent、eMule等P2P软件已经拥有极为庞大的用户群,每个人既是下载者也是上传者,一个新发布的文件转瞬之间就会像燎原之火一样遍布全世界,这是任何服务器都无法比拟的;P2SP时代:
多技术结合,进一步提高速度。
现在人们在整合了HTTP和FTP的服务器技术之后,对BT下载也进行了改进,独创了P2SP技术P2SP(PeertoServer&Peer)即点对服务器和点对点。
P2SP除了包含P2P,还多了一个“S”是指服务器。
P2SP有效地把原本孤立的服务器和其镜像资源以及P2P资源整合到了一起。
在下载的稳定性和下载的速度上,都比传统单一的P2P有了非常大的提高。
1.1问题描述
在日常生活中,我们会常常遇到一些下载工具,如;Thunder,Flashget。
这些软件在日常生活中带来了很多方便。
为什么这些软件能够快速的下载文件,能够在网络中断及网络异常时依然能够接着下载,通过分析网络http协议,获得其特点,实现下载。
其主要是采用了多线程技术和断点续传技术。
怎样实现这些断点续传,及多线程呢?
以及流量控制。
1.2技术分析
基于HTTP协议的客户机访问包括4个过程,分别是:
建立TCP套接字连接、发送HTTP请求报文、接收HTTP应答报文和关闭TCP套接字连接。
1.2.1创建TCP套接字连接
客户端与WEB服务器创建TCP套接字连接,其中WEB端服务器的地址可以通过域名解析确定,WEB端的套接字侦听端口一般是80。
1.2.2发送HTTP请求报文
客户端向WEB服务端发送请求报文,HTTP协议的请求报文格式如图1-1所示:
请求消息=请求行(实体头信息)CRLF[实体内容]
请求行=方法 URL HTTP版本号 CRLF
方法=GET|HEAD|POST|扩展方法
URL=协议名称+宿主名+目录与文件名
图1-1请求报文格式
其中“CRLF”表示回车换行。
“请求行”中的“方法”描述了对指定资源执行的动作,常用的方法“GET”、“HEAD”和“POST”等3种,它们的含义如表1-2所示:
表1-2报文方法描述
取值
描述
GET
从WEB服务器中获取对象,不同类型的对
象将获取不同的信息,比如:
·文件类型对象,获取该文件的内容。
·程序类型对象,获取该程序执行的结果。
·数据库查询类型对象,获取该查询的结果。
HEAD
要求服务器查找对象的元信息。
POST
从客户端向WEB服务器发送数据。
实体头信息中记载了报文的属性,利用这些信息可以实现客户端与WEB服务器之间的请求或应答,它包括报文的数据类型、压缩方法、语言、长度、压缩方法、最后一次修改时间、数据有效期等信息。
实体内容是报文传送的附加信息,一般供POST请求填写。
URL为“
GET
Accept:
*/*
Accept-Language:
zh-cn
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR2.0.50727)
Host:
Connection:
Keep-Alive
图1-3报文附加信息
其中"/upfile/media/guojia.mp3"是URL信息,语句"ACCEPT:
*/*"及其后的语句是"实体头信息"。
1.2.3接收HTTP应答报文
WEB服务器处理客户请求,并向客户机发送应答报文,HTTP协议的应答报文格式为:
应答报文=状态行(实体头信息)CRLF[实体内容]
状态行=HTTP版本号 状态码 原因叙述。
状态码描述了WEB服务器执行客户机请求的状态信息,表1-4描述了HTTP的应答码含义。
表1-4请求报文应答码
取值
描述
1xx
保留
2xx
成功接收,比如“200”表示处理成功
3xx
客户需进一步细化请求
4xx
客户错误,比如“404”表示访问指定资源不存在
5xx
服务器错误
1.2.4关闭TCP套接字连接
客户机与服务器双方关闭套接字连接,结束TCP/IP对话。
图1-5为某个应答报文例子。
HTTP/1.1200OK
Connection:
keep-alive
Date:
Thu,26Jul200714:
00:
02
GMTServer:
Microsoft-IIS/6.0
X-Powered-By:
ASP.NET
Content-Length:
190
Content-Type:
text/html
Set-Cookie:
ASPSESSIONIDSAATTCSQ=JOPPKDCAMHHBEOICJPGPBJOB;path=/
Cache-control:
private
爱花使者
图1-5应答报文
第2章数据分析与算法的实现
本软件涉及大量的数据分析,本软件主要是对文件的利用流传输时涉及多线程下载文件,基流与文件的转化,断点续传时多点建立连接,多点下载,然后合并到一个大文件,进行文件的整体的平均分配。
利用多线程使每个线程分别跳过文件下载完成部分,继续下载未完成部分。
2.1多线程及同步异步
多线程管理:
利用标准线程库实现多线程机制,将下载任务分为若干子任务,为每个子任务建立一个线程,并管理他们实现多线程同时连接下载。
互斥是指对某一临界区如代码段或文件等进行访问或修改时,只能允许一个线程执行,其他线程不能访问或修改。
一般互斥主要通过对临界区进行加锁来实现的。
如果没有互斥,则临界区就可以被其他线程所拥有,此时某一线程在访问临界区资源时,可能另一个线程正在修改它。
对重要部分未实现互斥会引起很多问题,严重时会引起死锁,造成程序崩溃。
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。
多线程之间的同步就是指使隶属于同一进程的各线程协调一致地工作。
2.2什么是断点续传技术
当在下载一个文件特别是比较大的文件时,如果由于某种原因如突然断线等使得下载中断,如果用户使用的是IE自带的下载工具或者其他不支持断点续传的下载软件的话,这就意味着你之前所花在下载该文件上的所有时间都白费,下次下载不得不从头开始,并且还要准备再次被突然中断的风险。
由此可见断点续传技术在下载软件中的作用。
断点续传就是如果下载中断,在重新建立连接后,跳过已经下载的部分,而只下裁还没有下载的部分。
在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。
当然并不是所有的文件都可以支持断点续传的。
如果在获得的HTTP应答报文的应答码不是206,则说明该网站服务器设置为不支持断点续传,此时只能依靠老办法,将其一次下载完成了。
2.3算法实现
2.3.1多线程接收文件
首先,建立连接request=(HttpWebRequest)HttpWebRequest.Create(strUrl);请求资源,分析文件长度filesize=request.GetResponse().ContentLength;取得目标文件的长度,利用方法AverageFileThread()来平均分配每个线程应该接收的文件大小并计算每个线程应该接收文件的大小(intfilethread=(int)(filesize-ResumeBrokenTransfer)/thread;),剩余部分由最后一个线程完成(intfilethreade=filethread+(int)filesize%thread;)。
平均分配完成后,用循环语句使每个线程都接收。
for(inti=0;i { if(i { filestartw[i]=filethread*i+(int)StartPort[i];//每个线程接收文件的起始点 Filesizew[i]=filethread-1;//每个线程接收文件的长度 } else { filestartw[i]=filethread*i+(int)StartPort[i]; filesizew[i]=filethreade-1; } } 最终实现在相同时间内接收5倍于原来的文件大小。 2.3.2断点续传算法的实现 断点续传顾名思义: 在断开连接后,重新建立连接后,跳过已经下载的部分,接着下载未下载部分。 它的实现首先,利用System.File.OpenWrite()方法打开每个线程下载后保存的临时文件中的内容,通过打开后获得下载的文件长度,利用filestream.Seek()方法实现查找文件下载后的位置,利用System.IO.FileStreamfs;HTTP的头部设置fs.AddRange()方法设置流继续下载的位置从而使文件流得以继续下载从而保证了文件的完整性。 下面是代码分析: for(inti=0;i { filenamew[i]=name+i.ToString()+".dat"; Filepath[i]=@"F: \第九组对对碰\zuixin\Thunder\Thunder\Bin\Debug\"+filenamew[i]; filenameStart[i]=System.IO.Path.GetFileName(Filepath[i]); if(System.IO.File.Exists(filenamew[i])) { filestream=System.IO.File.OpenWrite(filenamew[i]); StartPort[i]=filestream.Length; ResumeBrokenTransfer+=StartPort[i]; Filestream.Seek(StartPort[i],System.IO.SeekOrigin.Current); filestream.Close(); } } 上面是对临时文件的进行只读操作获得文件的长度;让每个线程在原来下载未完成的基础上,跳过已经下载部分,下载未完成部分,应注意续传前要设置HTTP的头部,通过AddRange()方法设置每个线程的下载的初始位置(formm.filestartw[threadh])及每个线程应接着下载的位置(formm.filestartw[threadh]+formm.filesizew[threadh]),同时也设置开始发送数据的位置,停止发送数据的位置,注意设置超时时间为无限大及(request.Timeout=-1),获得请求数据的响应的流从而使得每个线程在原来的下载的位置接着下载,从而使得既能多线程续传,又能多线程下载。 2.4多线程设计 多线程: 利用多线程机制,将下载的文件分为若干子文件,为每个子文件建立一个线程,并管理他们实现多线程同时连接下载。 接收资源分析其大小filesize平均分配; 线程数并非越大越好,一般情况下五个线程就可以了。 如表2.1所示。 表2.1线程的分配及合并 线程1 Filesize0 合并filesize0+filesize1+filesize2+filesize3+filesize4 线程2 Filesize1 线程3 Filesize2 线程4 Filesize3 线程5 Filesize4 第3章Http下载功能实现 通过本章介绍会详细的了解到HTTP实现的功能及主要部分。 3.1基本结构模块 这些模块的主要功能如下: HTTP下载: 按照HTTP协议的报文格式及其规则与服务器通信。 断点存储: 管理一个存放各线程下载进度的数据结构。 下载信息统计: 计算下载文件名、下载总速度、下载总进度等,并在终端显示。 文件管理: 负责本地文件的打开、读取、创建、清除等。 图3-1程序各模块的层次结构 3.1.3代码分析及介绍 请求资源(URL)及对文件的平均分割: 通过request=(HttpWebRequest)HttpWebRequest.Create(strurl);请求对资源的请求实现对文件的filesize的分割filesize=request.GetResponse().ContentLength;//取得目标文件的长度定义多线程 //接收线程数 thread=Convert.ToInt32(textBox3.Text.Trim().ToString()); //根据线程数初始化数组 threadw=newbool[thread]; filenamew=newstring[thread]; filestartw=newint[thread]; filesizew=newint[thread]; string[]Filepath=newstring[thread]; string[]filenameStart=newstring[thread]; StartPort=newlong[thread]; for(inti=0;i { filenamew[i]=name+i.ToString()+".dat"; //定义临时文件进行文件合并使用 if(System.IO.File.Exists(filenamew[i])) { filestream=System.IO.File.OpenWrite(filenamew[i]); StartPort[i]=filestream.Length; ResumeBrokenTransfer+=StartPort[i]; filestream.Seek(StartPort[i],System.IO.SeekOrigin.Current); filestream.Close(); } } 对文件进行接收从而实现多线程接收文件,实现文件的下载速度大大增加,所谓多线程就是启用多个线程又来接收文件分割后的歌部分在相同时间内下载5倍的文件(最好设置不超过5个线程从而使得CPU在处理线程不是大部分在处理下载文件线程,可以处理系统内部的其他程序。 下面进行多线程接收的解释: publicvoidAverageFileThread()//平均分配每个线程应该接收的文件大小 {//计算每个线程应该接收文件的大小 intfilethread=(int)(filesize-ResumeBrokenTransfer)/thread;//平均分配 intfilethreade=filethread+(int)filesize%thread;//剩余部分由最后一个线程完成 for(inti=0;i { threadw[i]=false;//每个线程状态的初始值为假 if(System.IO.File.Exists(filenamew[i])==false) { filenamew[i]=name+i.ToString()+".dat";//每个线程接收文件的临时文件名 } if(i { filestartw[i]=filethread*i+(int)StartPort[i];//每个线程接收文件的起始点 filesizew[i]=filethread-1;//每个线程接收文件的长度 } else { filestartw[i]=filethread*i+(int)StartPort[i]; filesizew[i]=filethreade-1; } } } 3.2断点续传 多线程下载及断点续传功能实现如图3.2: 图3-2程序续传功能图 3.2.1流程图 图3-3是程序的主要数据流图。 其中“接收下载任务”和“调度下载任务”在下载信息汇总模块,用于初始化下载。 图3-3程序主要结构图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三级 课题 网络 下载 工具箱