版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用 C# 实现 HTTP 协议下的多线程文件传输很多人都有过使用网络蚂蚁或网络快车软件下载互联网文件的经历,这些软件的使用可以 大大加速互联网上文件的传输速度,减少文件传输的时间。这些软件为什么有如此大的魔力呢? 其主要原因是这些软件都采用了 多线程下载 和 断点续传 技术。如果我们自己来编写一个类似这 样的程序,也能够快速的在互联网上下载文件,那一定是非常愉快的事情。下面我就讲一讲如 何利用 C# 语言编写一个支持多线程下载文件的程序,你会看到利用C# 语言编写网络应程序是多么的容易,从中也能体会到 C# 语言中强大的网络功能。首先介绍一下 HTTP 协议, HTTP 亦即 Hpyer Te
2、xt Transfer Protocal的缩写,它是现代互联网上最重要的一种网络协议,超文本传输协议位于 TCP/IP 协议的应用层,是一个面向 无连接、简单、快速的 C/S 结构的协议。 HTTP 的工作过程大体上分连接、请求、响应和断 开连接 四个步骤。 C# 语言对 HTTP 协议提供了良好的支持,在 .NET 类库中提供了 WebRequest 和 WebResponse 类,这两个类都包含在 System.Net 命名空间中,利用这 两个类可以实现很多高级的网络功能,本文中多线程文件下载就是利用这两个类实现的。 WebRequest 和 WebResponse 都是抽象基类,因此在程
3、序中不能直接作为对象使用,必须 被继承,实际使用中,可根据 URI 参数中的 URI 前缀选用它们合适的子类,对于 HTTP 这类 URI,HttpWebRequest 和 HttpWebResponse 类可以用于处理客户程序同 WEB 服务器之 间的 HTTP 通讯。HttpWebRequest 类实现了很多通过 HTTP 访问 WEB 服务器上文件的高级功能。 HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持, HttpWebRequest 将 发送到 Internet 资源的公共 HTTP 标头的值公开为属性,由方法或系统设置,常用的由属性 或方法设
4、置的 HTTP 标头为:接受 , 由 Accept 属性设置 , 连接 , 由 Connection 属性和 KeepAlive 属性设置 , Content-Length, 由 ContentLength 属性设置 , Content-Type, 由 ContentType 属性设置 , 范围 , 由 AddRange 方法设置 . 实际使用中是将标头信息正确设置 后,传递到 WEB 服务器 ,WEB 服务器根据要求作出回应。HttpWebResponse 类继承自 WebResponse 类,专门处理从 WEB 服务器返回的 HTTP 响应, 这个类实现了很多方法,具有很多属性,可以全面处
5、理接收到的互联网信息。在 HttpWebResponse 类中,对于大多数通用的 HTTP 标头字段,都有独立的属性与其对应, 程序员可以通过这些属性方便的访问位于 HTTP 接收报文标头字段中的信息,本例中用到的 HttpWebResponse 类属性为: ContentLength 既接收内容的长度。有了以上的了解后,下面看看这两个类的用法, 要创建 HttpWebRequest 对象,不要直 接使用 HttpWebRequest 的构造函数, 而要使用 WebRequest.Create 方法初始化一个 HttpWebRequest 实例,如:HttpWebRequest hwr=(Ht
6、tpWebRequest)WebRequest.Create(/);创建了这个对象后,就可以通过HttpWebRequest属性,设置很多 HTTP标头字段的内容,如hwr.AddRange(100,1000);设置接收对象的范围为100-1000 字节。HttpWebReques对象使用 GetResponse()方法时,会返回一个 HttpWebResponse对象,为提出HTTP返回报文信息,需要使用HttpWebResponse的GetResponseStream()方法,该方法返回一个Stream 对象,可以读取 HTTP返回的报文,如:首先定义一个
7、Strea n 对象public Syste m.IO .Stream ns;然后ns=hwr.GetResponse ().GetResponseStream ();即可创建 Stream 对象。有了以上的准备知识后下面开始设计我们的多线程互联网文件的下载程序,首先打开VisualStudio.Net集成开发环境,选择文件” 新建” 项目”然后选择 Visual C#项目”在向导右边列表框中选中Windows 应用程序”输入项目名称,如本例为:httpftp,然后选择 确定”按钮,向导自动生成了一个Win dows应用程序项目。首先打开窗口设计器设计应用程序窗口,增加如下控件:一个列表框li
8、stBox1三个文本标签Iabel1-label3三个文本框textBox1-textBox3 个开始接收按钮butto n1设计好的窗口如下图:控件定义代码是:public System.Wi ndows.Forms.ListBox listBoxI;private System.Wi ndows.Forms.Label labell;private System.Wi ndows.Forms.TextBox textBox1private System.Wi ndows.Forms.Butt on butt on1;private System.Wi ndows.Forms.Label l
9、abel2;private System.Wi ndows.Forms.TextBox textBox2;private System.Wi ndows.Forms.Label label3;private System.Wi ndows.Forms.TextBox textBox3;private System.Wi ndows.Forms.Label label4;private System.Wi ndows.Forms.TextBox textBox4;打开Form1的代码编辑器,增加如下的命名空间:using System.Net;/网络功能using System.lO;/流支持u
10、sing System.Thread ing ;/线程支持增加如下的程序变量:接受文件的 文件合并标志 进程数每个线程结束标志每个线程接收文件的文件名 每个线程接收文件的起始位置 每个线程接收文件的大小 URL定义一个 HttpFile类,用于管理接收线程,其代码如下:public class HttpFile public Form1 formm; public int threadh;/ public string filename;/ public string strUrl;/线程代号文件名接收文件的 URLpublic FileStream fs;public HttpWebRequ
11、est request;public System.IO.Stream ns;public byte nbytes;/接收缓冲区public int nreadsize;/接收字节数public HttpFile(Form1 form,int thread)/构造方法formm=form;threadh=thread;HttpFile()/ 析构方法formm.Dispose ();public void receive()/ 接收线程filename=formm.filenamewthreadh;strUrl=formm.strurl;ns=null;nbytes= new byte512;
12、 nreadsize=0;formm.listBox1 .Items .Add (线程 +threadh.ToString ()+开始接收 );fs=new FileStream (filename,System.IO.FileMode.Create);public bool threadw; / public string filenamew;/ public int filestartw;/ public int filesizew;/ public string strurl;/ public bool hb;/ public int thread;/tryrequest=(HttpWe
13、bRequest)HttpWebRequest.Create (strUrl);/ 接收的起始位置及接收的长度 request.AddRange(formm.filestartw threadh, formm.filestartw threadh+formm.filesizew threadh); ns=request.GetResponse ().GetResponseStream ();/获得接收流nreadsize=ns.Read (nbytes,0,512);while (nreadsize0)fs.Write (nbytes,0,nreadsize);nreadsize=ns.Rea
14、d (nbytes,0,512);formm.listBox1 .Items .Add ( 线程 +threadh.ToString ()+ 正在接收 );fs.Close();ns.Close ();catch (Exception er)MessageBox.Show (er.Message );fs.Close();formm.listBox1 .Items.Add (进程 +threadh.ToString ()+接收完毕 !);formm.threadwthreadh=true;该类和 Form1 类处于统一命名空间,但不包含在 Form1 类中。下面定义“开始接收”按钮控件的事 件
15、响应函数:private void button1_Click(object sender, System.EventArgs e)DateTime dt=DateTime.Now;/ 开始接收时间 textBox1.Text =dt.ToString ();strurl=textBox2.Text .Trim ().ToString ();HttpWebRequest request;long filesize=0;tryrequest=(HttpWebRequest)HttpWebRequest.Create (strurl); filesize=request.GetResponse (
16、).ContentLength;/ 取得目标文件的长度 request.Abort (); catch (Exception er)MessageBox.Show (er.Message ); / 接收线程数thread=Convert.ToInt32 (textBox4.Text .Trim().ToString (),10);/ 根据线程数初始化数组 threadw=new bool thread; filenamew=new string thread; filestartw=new int thread; filesizew=new intthread;/ 计算每个线程应该接收文件的大
17、小int filethread=(int)filesize/thread;/ 平均分配int filethreade=filethread+(int)filesize%thread;/ 剩余部分由最后 / 为数组赋值for (int i=0;ithread;i+)threadwi=false;/ 每个线程状态的初始值为假个线程完成filenamewi=i.ToString ()+.dat;/if (ithread-1)filestartwi=filethread*i;/filesizewi=filethread-1;/elsefilestartwi=filethread*i; filesize
18、wi=filethreade-1;/ 定义线程数组,启动接收线程Thread threadk=new Thread thread;HttpFile httpfile=new HttpFile thread;for (int j=0;jthread;j+)每个线程接收文件的临时文件名每个线程接收文件的起始点每个线程接收文件的长度httpfilej=new HttpFile(this,j);threadkj=new Thread(new ThreadStart (httpfilej.receive ); threadkj.Start ();/ 启动合并各线程接收的文件线程Thread hbth=new Thread (new ThreadStart (hbfile);hbth.Start ();合并文件的线程 hbfile 定义在 Form1 类中 , 定义如下:public void hbfile()while (true)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度智能停车系统车库交易合同2篇
- 二零二五年度家政服务与家庭旅游策划合同3篇
- 二零二五年度叉车维修保养与维修设备租赁合同2篇
- 2025年度综合体物业房使用及公共设施维护协议3篇
- 二零二五年度大棚养殖废弃物资源化利用合作协议2篇
- 二零二五年度文化旅游项目借款及旅游资源担保服务协议3篇
- 二零二五年度保障性住房置换合同范本
- 二零二五年度ISO9001质量管理体系认证咨询与实施合同3篇
- 二零二五年度加油站油品供应与信息化建设合同3篇
- 船舶管系课程设计
- 河南省郑州高新技术产业开发区2023-2024学年三年级上学期1月期末科学试题
- 女装行业退货率分析
- 领导沟通的艺术
- 纯视觉方案算法
- 道士述职报告
- 绿色贷款培训课件
- 2024年七年级语文上学期期末作文题目及范文汇编
- 云南省昆明市五华区2023-2024学年九年级上学期期末英语试卷+
- 2023年生产运营副总经理年度总结及下一年计划
- 2023年中考语文标点符号(顿号)练习(含答案)
- 施工图审查招标文件范文
评论
0/150
提交评论