c#

位置:IT落伍者 >> c# >> 浏览文章

用C#实现HTTP协议下的多线程文件传输


发布日期:2022年06月07日
 
用C#实现HTTP协议下的多线程文件传输

很多人都有过使用网络蚂蚁或网络快车软件下载互联网文件的经历这些软件的使用可以大大加速互联网上文件的传输速度减少文件传输的时间这些软件为什么有如此大的魔力呢?其主要原因是这些软件都采用了多线程下载和断点续传技术如果我们自己来编写一个类似这样的程序也能够快速的在互联网上下载文件那一定是非常愉快的事情下面我就讲一讲如何利用C#语言编写一个支持多线程下载文件的程序你会看到利用C#语言编写网络应程序是多么的容易从中也能体会到C#语言中强大的网络功能

首先介绍一下HTTP协议HTTP亦即Hpyer Text Transfer Protocal的缩写它是现代互联网上最重要的一种网络协议超文本传输协议位于TCP/IP协议的应用层是一个面向无连接简单快速的C/S结构的协议HTTP的工作过程大体上分连接请求响应和断开连接四个步骤C#语言对HTTP协议提供了良好的支持NET类库中提供了WebRequest和WebResponse类这两个类都包含在SystemNet命名空间中利用这两个类可以实现很多高级的网络功能本文中多线程文件下载就是利用这两个类实现的 WebRequest和WebResponse都是抽象基类因此在程序中不能直接作为对象使用必须被继承实际使用中可根据URI参数中的URI前缀选用它们合适的子类对于HTTP这类URIHttpWebRequest和HttpWebResponse类可以用于处理客户程序同WEB服务器之间的HTTP通讯

HttpWebRequest类实现了很多通过HTTP访问WEB服务器上文件的高级功能HttpWebRequest类对WebRequest中定义的属性和方法提供支持HttpWebRequest将发送到Internet资源的公共HTTP标头的值公开为属性由方法或系统设置常用的由属性或方法设置的HTTP标头为接受 由Accept属性设置 连接 由Connection属性和KeepAlive属性设置 ContentLength 由ContentLength属性设置 ContentType 由ContentType属性设置 范围 由AddRange方法设置 实际使用中是将标头信息正确设置后传递到WEB服务器WEB服务器根据要求作出回应

HttpWebResponse类继承自WebResponse类专门处理从WEB服务器返回的HTTP响应这个类实现了很多方法具有很多属性可以全面处理接收到的互联网信息在HttpWebResponse类中对于大多数通用的HTTP标头字段都有独立的属性与其对应程序员可以通过这些属性方便的访问位于HTTP接收报文标头字段中的信息本例中用到的HttpWebResponse类属性为ContentLength 既接收内容的长度

有了以上的了解后下面看看这两个类的用法要创建HttpWebRequest对象不要直接使用HttpWebRequest的构造函数而要使用WebRequestCreate方法初始化一个HttpWebRequest实例

HttpWebRequest hwr=(HttpWebRequest)WebRequestCreate(http://wwwcom/);

创建了这个对象后就可以通过HttpWebRequest属性设置很多HTTP标头字段的内容如hwrAddRange();设置接收对象的范围为字节

HttpWebReques对象使用GetResponse()方法时会返回一个HttpWebResponse对象为提出HTTP返回报文信息需要使用HttpWebResponse的GetResponseStream()方法该方法返回一个Stream对象可以读取HTTP返回的报文首先定义一个Strean 对象 public SystemIOStream ns; 然后 ns=hwrGetResponse ()GetResponseStream ();即可创建Stream对象有了以上的准备知识后下面开始设计我们的多线程互联网文件的下载程序首先打开Visual StudioNet集成开发环境选择文件新建项目然后选择Visual C#项目在向导右边列表框中选中Windows应用程序输入项目名称如本例为httpftp然后选择确定按钮向导自动生成了一个Windows应用程序项目首先打开窗口设计器设计应用程序窗口增加如下控件

一个列表框 listBox 三个文本标签 labellabel 三个文本框 textBoxtextBox 一个开始接收按钮 button 设计好的窗口如下图

控件定义代码是

public SystemWindowsFormsListBox listBox;

private SystemWindowsFormsLabel label;

private SystemWindowsFormsTextBox textBox

private SystemWindowsFormsButton button;

private SystemWindowsFormsLabel label;

private SystemWindowsFormsTextBox textBox;

private SystemWindowsFormsLabel label;

private SystemWindowsFormsTextBox textBox;

private SystemWindowsFormsLabel label;

private SystemWindowsFormsTextBox textBox;

打开Form的代码编辑器增加如下的命名空间

using SystemNet;//网络功能

using SystemIO;//流支持

using SystemThreading ;//线程支持

增加如下的程序变量

public bool[] threadw; //每个线程结束标志

public string[] filenamew;//每个线程接收文件的文件名

public int[] filestartw;//每个线程接收文件的起始位置

public int[] filesizew;//每个线程接收文件的大小

public string strurl;//接受文件的URL

public bool hb;//文件合并标志

public int thread;//进程数

               

上一篇:.Net开发漫谈:关于命名空间和目录划分

下一篇:C#事件(Event)解析