成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用C#實(shí)現(xiàn)HTTP協(xié)議下的多線程文件傳輸

開發(fā) 后端
C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運(yùn)行的過程.但是卻有著明顯的不同,本文介紹的是用C#實(shí)現(xiàn)HTTP協(xié)議下的多線程文件傳輸,一起來看。

C#(C Sharp)是微軟(Microsoft)為.NET Framework量身訂做的程序語言,C#擁有C/C++的強(qiáng)大功能以及Visual Basic簡易使用的特性,是***個(gè)組件導(dǎo)向(Component-oriented)的程序語言,和C++與Java一樣亦為對(duì)象導(dǎo)向(object-oriented)程序語言。下面主要介紹的是用C#實(shí)現(xiàn)HTTP協(xié)議下的多線程文件傳輸。

很多人都有過使用網(wǎng)絡(luò)螞蟻或網(wǎng)絡(luò)快車軟件下載互聯(lián)網(wǎng)文件的經(jīng)歷,這些軟件的使用可以大大加速互聯(lián)網(wǎng)上文件的傳輸速度,減少文件傳輸?shù)臅r(shí)間。這些軟件為什么有如此大的魔力呢?

其主要原因是這些軟件都采用了多線程下載和斷點(diǎn)續(xù)傳技術(shù)。如果我們自己來編寫一個(gè)類似這樣的程序,也能夠快速的在互聯(lián)網(wǎng)上下載文件,那一定是非常愉快的事情。下面我就講一講如何利用C#語言編寫一個(gè)支持多線程下載文件的程序,你會(huì)看到利用C#語言編寫網(wǎng)絡(luò)應(yīng)程序是多么的容易,從中也能體會(huì)到C#語言中強(qiáng)大的網(wǎng)絡(luò)功能。

首先介紹一下HTTP協(xié)議,HTTP亦即Hpyer Text Transfer Protocal的縮寫,它是現(xiàn)代互聯(lián)網(wǎng)上最重要的一種網(wǎng)絡(luò)協(xié)議,超文本傳輸協(xié)議位于TCP/IP協(xié)議的應(yīng)用層,是一個(gè)面向無連接、簡單、快速的C/S結(jié)構(gòu)的協(xié)議。HTTP的工作過程大體上分連接、請(qǐng)求、響應(yīng)和斷開連接四個(gè)步驟。

C#語言對(duì)HTTP協(xié)議提供了良好的支持,在.NET類庫中提供了WebRequest和WebResponse類,這兩個(gè)類都包含在System.Net命名空間中,利用這兩個(gè)類可以實(shí)現(xiàn)很多高級(jí)的網(wǎng)絡(luò)功能,本文中多線程文件下載就是利用這兩個(gè)類實(shí)現(xiàn)的。

WebRequest和WebResponse都是抽象基類,因此在程序中不能直接作為對(duì)象使用,必須被繼承,實(shí)際使用中,可根據(jù)URI參數(shù)中的URI前綴選用它們合適的子類,對(duì)于HTTP這類URI,HttpWebRequest和HttpWebResponse類可以用于處理客戶程序同WEB服務(wù)器之間的HTTP通訊。

HttpWebRequest類實(shí)現(xiàn)了很多通過HTTP訪問WEB服務(wù)器上文件的高級(jí)功能。HttpWebRequest類對(duì)WebRequest中定義的屬性和方法提供支持,HttpWebRequest將發(fā)送到Internet資源的公共HTTP標(biāo)頭的值公開為屬性,由方法或系統(tǒng)設(shè)置,常用的由屬性或方法設(shè)置的HTTP標(biāo)頭為:接受, 由Accept屬性設(shè)置, 連接, 由Connection屬性和KeepAlive屬性設(shè)置, Content-Length, 由ContentLength屬性設(shè)置, Content-Type, 由ContentType屬性設(shè)置, 范圍, 由AddRange方法設(shè)置. 實(shí)際使用中是將標(biāo)頭信息正確設(shè)置后,傳遞到WEB服務(wù)器,WEB服務(wù)器根據(jù)要求作出回應(yīng)。

HttpWebResponse類繼承自WebResponse類,專門處理從WEB服務(wù)器返回的HTTP響應(yīng),這個(gè)類實(shí)現(xiàn)了很多方法,具有很多屬性,可以全面處理接收到的互聯(lián)網(wǎng)信息。在HttpWebResponse類中,對(duì)于大多數(shù)通用的HTTP標(biāo)頭字段,都有獨(dú)立的屬性與其對(duì)應(yīng),程序員可以通過這些屬性方便的訪問位于HTTP接收?qǐng)?bào)文標(biāo)頭字段中的信息,本例中用到的HttpWebResponse類屬性為:ContentLength 既接收內(nèi)容的長度。

有了以上的了解后,下面看看這兩個(gè)類的用法,要?jiǎng)?chuàng)建HttpWebRequest對(duì)象,不要直接使用HttpWebRequest的構(gòu)造函數(shù),而要使用WebRequest.Create方法初始化一個(gè)HttpWebRequest實(shí)例,如:

 

  1. HttpWebRequest hwr=(HttpWebRequest)WebRequest.Create(http://www.163.com/); 

 

創(chuàng)建了這個(gè)對(duì)象后,就可以通過HttpWebRequest屬性,設(shè)置很多HTTP標(biāo)頭字段的內(nèi)容,如hwr.AddRange(100,1000);設(shè)置接收對(duì)象的范圍為100-1000字節(jié)。

HttpWebReques對(duì)象使用GetResponse()方法時(shí),會(huì)返回一個(gè)HttpWebResponse對(duì)象,為提出HTTP返回報(bào)文信息,需要使用HttpWebResponse的GetResponseStream()方法,該方法返回一個(gè)Stream對(duì)象,可以讀取HTTP返回的報(bào)文,如:首先定義一個(gè)Strean 對(duì)象 public System.IO.Stream ns; 然后 ns=hwr.GetResponse ().GetResponseStream ();即可創(chuàng)建Stream對(duì)象。

#p#

有了以上的準(zhǔn)備知識(shí)后下面開始設(shè)計(jì)我們的多線程互聯(lián)網(wǎng)文件的下載程序,首先打開Visual Studio.Net集成開發(fā)環(huán)境,選擇“文件”、“新建”、“項(xiàng)目”,然后選擇“Visual C#項(xiàng)目”,在向?qū)в疫吜斜砜蛑羞x中“Windows應(yīng)用程序”,輸入項(xiàng)目名稱,如本例為:httpftp,然后選擇“確定”按鈕,向?qū)ё詣?dòng)生成了一個(gè)Windows應(yīng)用程序項(xiàng)目。首先打開窗口設(shè)計(jì)器設(shè)計(jì)應(yīng)用程序窗口,增加如下控件:

一個(gè)列表框 listBox1 三個(gè)文本標(biāo)簽 label1-label3 三個(gè)文本框 textBox1-textBox3 一個(gè)開始接收按鈕 button1 設(shè)計(jì)好的窗口。

控件定義代碼是:

 

  1. public System.Windows.Forms.ListBox listBox1;  
  2. private System.Windows.Forms.Label label1;  
  3. private System.Windows.Forms.TextBox textBox1  
  4. private System.Windows.Forms.Button button1;  
  5. private System.Windows.Forms.Label label2;  
  6. private System.Windows.Forms.TextBox textBox2;  
  7. private System.Windows.Forms.Label label3;  
  8. private System.Windows.Forms.TextBox textBox3;  
  9. private System.Windows.Forms.Label label4;  
  10. private System.Windows.Forms.TextBox textBox4; 

 

打開Form1的代碼編輯器,增加如下的命名空間:

 

  1. using System.Net;//網(wǎng)絡(luò)功能  
  2. using System.IO;//流支持  
  3. using System.Threading ;//線程支持 

 

增加如下的程序變量:

 

  1. public bool[] threadw; //每個(gè)線程結(jié)束標(biāo)志  
  2. public string[] filenamew;//每個(gè)線程接收文件的文件名  
  3. public int[] filestartw;//每個(gè)線程接收文件的起始位置  
  4. public int[] filesizew;//每個(gè)線程接收文件的大小  
  5. public string strurl;//接受文件的URL  
  6. public bool hb;//文件合并標(biāo)志  
  7. public int thread;//進(jìn)程數(shù) 

 

定義一個(gè)HttpFile類,用于管理接收線程,其代碼如下:

 

  1. public class HttpFile  
  2. {  
  3.  public Form1 formm;  
  4.  public int threadh;//線程代號(hào)  
  5.  public string filename;//文件名  
  6.  public string strUrl;//接收文件的URL  
  7.  public FileStream fs;  
  8.  public HttpWebRequest request;  
  9.  public System.IO.Stream ns;  
  10.  public byte[] nbytes;//接收緩沖區(qū)  
  11.  public int nreadsize;//接收字節(jié)數(shù)  
  12.  public HttpFile(Form1 form,int thread)//構(gòu)造方法  
  13.  {  
  14. formm=form;  
  15. threadh=thread;  
  16.  }  
  17.  ~HttpFile()//析構(gòu)方法  
  18.  {  
  19. formm.Dispose ();  
  20.  }  
  21.  public void receive()//接收線程  
  22.  {  
  23. filename=formm.filenamew[threadh];  
  24. strUrl=formm.strurl;  
  25. ns=null;  
  26. nbytes= new byte[512];  
  27. nreadsize=0;  
  28. formm.listBox1 .Items .Add ("線程"+threadh.ToString ()+"開始接收");  
  29. fs=new FileStream (filename,System.IO.FileMode.Create);  
  30. try 
  31. {  
  32.  request=(HttpWebRequest)HttpWebRequest.Create (strUrl);  
  33.  //接收的起始位置及接收的長度  
  34.  request.AddRange(formm.filestartw [threadh],  
  35.  formm.filestartw [threadh]+formm.filesizew [threadh]);  
  36.  ns=request.GetResponse ().GetResponseStream ();//獲得接收流  
  37.  nreadsize=ns.Read (nbytes,0,512);  
  38.  while (nreadsize>0)  
  39.  {  
  40. fs.Write (nbytes,0,nreadsize);  
  41. nreadsize=ns.Read (nbytes,0,512);  
  42. formm.listBox1 .Items .Add ("線程"+threadh.ToString ()+"正在接收");  
  43.  }  
  44.  fs.Close();  
  45.  ns.Close ();  
  46. }  
  47. catch (Exception er)  
  48. {  
  49.  MessageBox.Show (er.Message );  
  50.  fs.Close();  
  51. }  
  52. formm.listBox1 .Items.Add ("進(jìn)程"+threadh.ToString ()+"接收完畢!");  
  53. formm.threadw[threadh]=true;  
  54.  }} 

 

該類和Form1類處于統(tǒng)一命名空間,但不包含在Form1類中。下面定義“開始接收”按鈕控件的事件響應(yīng)函數(shù):

 

  1. private void button1_Click(object sender, System.EventArgs e)  
  2. {  
  3.  DateTime dt=DateTime.Now;//開始接收時(shí)間  
  4.  textBox1.Text =dt.ToString ();  
  5.  strurl=textBox2.Text .Trim ().ToString ();  
  6.  HttpWebRequest request;  
  7.  long filesize=0;  
  8.  try 
  9.  {  
  10. request=(HttpWebRequest)HttpWebRequest.Create (strurl);  
  11. filesize=request.GetResponse ().ContentLength;//取得目標(biāo)文件的長度  
  12. request.Abort ();  
  13.  }  
  14.  catch (Exception er)  
  15.  {  
  16. MessageBox.Show (er.Message );  
  17.  }  
  18.  // 接收線程數(shù)  
  19.  thread=Convert.ToInt32 (textBox4.Text .Trim().ToString (),10);  
  20.  //根據(jù)線程數(shù)初始化數(shù)組  
  21.  threadw=new bool [thread];  
  22.  filenamew=new string [thread];  
  23.  filestartw=new int [thread];  
  24.  filesizew=new int[thread];  
  25.  
  26.  //計(jì)算每個(gè)線程應(yīng)該接收文件的大小  
  27.  int filethread=(int)filesize/thread;//平均分配  
  28.  int filethreade=filethread+(int)filesize%thread;//剩余部分由***一個(gè)線程完成  
  29.  //為數(shù)組賦值  
  30.  for (int i=0;i<thread;i++)  
  31.  {  
  32. threadw[i]=false;//每個(gè)線程狀態(tài)的初始值為假  
  33. filenamew[i]=i.ToString ()+".dat";//每個(gè)線程接收文件的臨時(shí)文件名  
  34. if (i<thread-1)  
  35. {  
  36.  filestartw[i]=filethread*i;//每個(gè)線程接收文件的起始點(diǎn)  
  37.  filesizew[i]=filethread-1;//每個(gè)線程接收文件的長度  
  38. }  
  39. else 
  40. {  
  41.  filestartw[i]=filethread*i;  
  42.  filesizew[i]=filethreade-1;  
  43. }  
  44.  }  
  45.  //定義線程數(shù)組,啟動(dòng)接收線程  
  46.  Thread[] threadk=new Thread [thread];  
  47.  HttpFile[] httpfile=new HttpFile [thread];  
  48.  for (int j=0;j<thread;j++)  
  49.  {  
  50. httpfile[j]=new HttpFile(this,j);  
  51. threadk[j]=new Thread(new ThreadStart (httpfile[j].receive ));  
  52. threadk[j].Start ();  
  53.  }  
  54.  //啟動(dòng)合并各線程接收的文件線程  
  55.  Thread hbth=new Thread (new ThreadStart (hbfile));  
  56.  hbth.Start ();  

 

合并文件的線程hbfile定義在Form1類中,定義如下:

 

  1. public void hbfile()  
  2. {  
  3.  while (true)//等待  
  4.  {  
  5. hb=true;  
  6. for (int i=0;i<thread;i++)  
  7. {  
  8.  if (threadw[i]==false)//有未結(jié)束線程,等待  
  9.  {  
  10. hb=false;  
  11. Thread.Sleep (100);  
  12. break;  
  13.  }  
  14. }  
  15. if (hb==true)//所有線程均已結(jié)束,停止等待,  
  16. {  
  17.  break;  
  18. }  
  19.  }  
  20.  FileStream fs;//開始合并  
  21.  FileStream fstemp;  
  22.  int readfile;  
  23.  byte[] bytes=new byte[512];  
  24.  fs=new FileStream (textBox3.Text .Trim ().ToString (),System.IO.FileMode.Create);  
  25.  for (int k=0;k0)  
  26.  {  
  27. fs.Write (bytes,0,readfile);  
  28.  }  
  29.  else 
  30.  {  
  31. break;  
  32.  }  
  33. }  
  34. fstemp.Close ();  
  35.  }  
  36.  fs.Close ();  
  37.  DateTime dt=DateTime.Now;  
  38.  textBox1.Text =dt.ToString ();//結(jié)束時(shí)間  
  39.  MessageBox.Show ("接收完畢!!!");  

 

至此,一個(gè)多線程下載文件的程序就大功告成了,注意在輸入本地文件名時(shí),應(yīng)按如下格式輸入:“c:\\test\\httpftp\\bin\\d.htm”,因”\”后的字符在C#中是轉(zhuǎn)義字符,線程數(shù)并非越大越好,一般5個(gè)線程就可以了,該程序在Visual Studio.Net 2002開發(fā)環(huán)境及Windows xp 操作系統(tǒng)上通過。

【編輯推薦】

  1. C#簡單游戲外掛制作(以Warcraft Ⅲ為例)
  2. 關(guān)于C#委托你不可不知的幾件事
  3. 利用C#實(shí)現(xiàn)任務(wù)欄通知窗口
  4. C#控件的閃爍問題解決方法總結(jié)
責(zé)任編輯:于鐵 來源: 王阿非的博客
相關(guān)推薦

2009-08-26 14:35:00

用C#實(shí)現(xiàn)HTTP協(xié)議

2009-09-07 13:38:03

C# HTTP文件傳輸HTTP文件傳輸

2010-07-01 15:55:54

FTP文件傳輸協(xié)議

2010-06-28 14:25:16

2010-06-09 15:40:01

FTP文件傳輸協(xié)議

2011-08-24 10:18:56

2010-06-28 11:15:45

BitTorrent協(xié)

2010-06-28 15:41:04

FTP文件傳輸協(xié)議

2010-06-09 15:55:20

FTP文件傳輸協(xié)議

2012-02-16 08:19:03

2012-04-05 13:24:30

2009-08-12 18:04:44

編寫C#多線程

2024-12-30 06:00:00

C#線程編程

2024-05-10 07:44:23

C#進(jìn)程程序

2024-10-21 16:59:37

C#編程多線程

2009-08-26 18:13:55

C#多線程lock

2011-04-25 14:42:10

C#lock

2020-11-13 08:30:57

Socket

2023-11-19 11:44:45

2009-08-28 16:43:57

C#多線程學(xué)習(xí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美中文一区 | 成人日b视频 | 国产精品a久久久久 | 日韩精品在线一区二区 | 亚洲伊人a | 最新中文字幕久久 | 日韩一级欧美一级 | 日本淫视频 | 国产精品欧美一区二区三区不卡 | 国产成人精品一区二区三区网站观看 | 免费在线视频精品 | www久久久 | 中文字幕亚洲国产 | 久久久久国产一区二区三区四区 | 四虎最新地址 | 一区二区在线不卡 | 国产欧美一区二区精品忘忧草 | 国产黄色小视频 | 精品久久久久久久久久久久久久久久久 | 国产目拍亚洲精品99久久精品 | 成人国产在线视频 | 在线观看亚洲精品视频 | 一区二区视频在线 | 精精国产xxxx视频在线 | 欧美一级毛片免费观看 | 中文字幕一区二区三区精彩视频 | 伊人中文网| 日韩免费在线观看视频 | 亚洲国产成人精品女人 | 欧美一区二区三区免费在线观看 | 欧美亚洲国产日韩 | 亚洲www. | 中文日韩在线 | 日本二区 | 久久亚洲国产精品日日av夜夜 | 337p日本欧洲亚洲大胆鲁鲁 | 欧美一级在线观看 | 久久91av| 欧美一区二区在线播放 | 九九av | 亚洲精品99 |