快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰app在线下载_龟发之家论坛



HTTP亦即Hpyer Text Transfer Protocal的缩写,它是今世互联网上最紧张的一种收集协议,超文本传输协议位于TCP/IP协议的利用层,是一个面向无连接、简单、快速的C/S布局的协议。HTTP的事情历程大年夜体上分连接、哀求、相应和断开连接四个步骤。C#说话对HTTP协议供给了优越的支持,在.NET类库中供给了WebRequest和WebResponse类,这两个类都包孕在System.Net命名空间中,使用这两个类可以实现很多高档的收集功能,本文中多线程文件下载便是使用这两个类实现的。 WebRequest和WebResponse都是抽象基类,是以在法度榜样中不能直接作为工具应用,必须被承袭,实际应用中,可根据URI参数中的URI前缀选用它们相宜的子类,对付HTTP这类URI,HttpWebRequest和HttpWebResponse类可以用于处置惩罚客户法度榜样同WEB办事器之间的HTTP通澳门新葡亰app在线下载讯。

HttpWebRequest类实现了很多经由过程HTTP造访WEB办事器上文件的高档功能。HttpWebRequest类对WebRequest中定义的属性和措施供给支持,HttpWebRequest将发送到Internet资本的公共HTTP标头的值公开为属性,由措施或系统设置,常用的由属性或措施设置的HTTP标头为:吸收, 由Accept属性设置, 连接, 由Connection属性和KeepAlive属性设置, Content-Length, 由ContentLength属性设置, Content-Type, 由ContentType属性设置, 范围, 由AddRange措施设置. 实际应用中是将标头信息精确设置后,通报到WEB办事器,WEB办事器根据要求作出回应。

HttpWebResponse类承袭自WebResponse类,专门处置惩罚从WEB办事器返回的HTTP相应,这个类实现了很多措施,具有很多属性,可以周全处置惩罚接管到的互联网信息。在HttpWebResponse类中,对付大年夜多半通用的HTTP标头字段,都有自力的属性与其对应,法度榜样员可以经由过程这些属性方便的造访位于HTTP接管报文标头字段中的信息,本例顶用到的HttpWebResponse类属性为:ContentLengt澳门新葡亰app在线下载h 既接管内容的长度。

using System.Net;//收集功能

using System.IO;//流支持

using System.Threading ;//线程支持

增添如下的法度榜样变量:

public bool[] threadw; //每个线程停止标志

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

public int[] filestartw;//每个线程接管文件的肇端位置

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

public string strurl;//吸收文件的URL

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

public int thread;//进程数

定义一个HttpFile类,用于治理接管线程,其代码如下:

public class HttpFile

{

public Form1 formm;

public int threadh;//线程代号

public string filename;//文件名

public string strUrl;//接管文件的URL

public FileStream fs;

public HttpWebRequest 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.filenamew[threadh];

strUrl=formm.strurl;

ns=null;

nbytes= new byte[512];

nreadsize=0;

formm.listBox1 .Items .Add ("线程"+threadh.ToString ()+"开始接管");

fs=new FileStream (filename,System.IO.FileMode.Create);

try

{

request=(HttpWebRequest)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 (nreadsize>0)

{

fs.Write (nbytes,0,nreadsize);

nreadsize=ns.Read (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.threadw[threadh]=true;

}

}

该类和Form1类处于统一命名空间,但不包孕在Form1类中。下面定义“开始接管”按钮控件的事故相应函数:

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;

try

{

request=(澳门新葡亰app在线下载HttpWebRequest)HttpWebRequest.Create (strurl);

filesize=request.GetResponse ().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 int[thread];

//谋略每个线程应该接管文件的大年夜小

int filethread=(int)filesize/thread;//匀称分配

int filethreade=filethread+(int)filesize%thread;//残剩部分由着末一个线程完成

//为数组赋值

for (int i=0;ithread;澳门新葡亰app在线下载i++)

{

threadw[i]=false;//每个线程状态的初始值为假

filenamew[i]=i.ToString ()+".dat";//每个线程接管文件的临时文件名

if (ithread-1)

{

filestartw[i]=filethread*i;//每个线程接管文件的肇端点

filesizew[i]=filethread-1;//每个线程接管文件的长度

}

else

{

filestartw[i]=filethread*i;

filesizew[i]=filethreade-1;

}

}

//定义线程数组,启动接管线程

Thread[] threadk=new Thread [thread];

HttpFile[] httpfile=new HttpFile [thread];

for (int j=0;jthread;j++)

{

httpfile[j]=new HttpFile(this,j);

threadk[j]=new Thread(new ThreadStart (httpfile[j].receive ));

threadk[j].Start ();

}

//启动合并各线程接管的文件线程

Thread hbth=new Thread (new ThreadStart (hbfile));

hbth.Start ();

}

合并文件的线程hbfile定义在Form1类中,定义如下:

public void hbfile()

{

while (true)//等待

{

hb=true;

for (int i=0;ithread;i++)

{

if (threadw[i]==false)//有未停止线程,等待

{

hb=false;

Thread.Sleep (100);

break;

}

}

if (hb==true)//所有线程均已停止,竣事等待,

{

break;

}

}

FileStream fs;//开始合并

FileStream fstemp;

int readfile;

byte[] bytes=new byte[512];

fs=new FileStream (textBox3.Text .Trim ().ToString (),System.IO.FileMode澳门新葡亰app在线下载.Create);

for (int k=0;kthread;k++)

{

fstemp=new FileStream (filenamew[k],System.IO.FileMode .Open);

while (true)

{

readfile=fstemp.Read (bytes,0,512);

if (readfile>0)

{

fs.Write (bytes,0,readfile);

}

else

{

break;

}

}

fstemp.Close ();

}

fs.Close ();

DateTime dt=DateTime.Now;

textBox1.Text =dt.ToString ();//停止光阴

MessageBox.Show ("接管完毕!!!");

}

您可能还会对下面的文章感兴趣: