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

學習C#實現HTTP協議:多線程文件傳輸

開發 后端
HTTP亦即Hpyer Text Transfer Protocal的縮寫,它是現代互聯網上最重要的一種網絡協議,本文就介紹了如何用C#實現HTTP協議下的多線程文件傳輸,供大家參考。

很多人都有過使用網絡螞蟻或網絡快車互聯網文件的經歷,這些軟件的使用可以大大加速互聯網上文件的傳輸速度,減少文件傳輸的時間。這些軟件為什么有如此大的魔力呢?其主要原因是這些軟件都采用了多線程下載和斷點續傳技術。如果我們自己來編寫一個類似這樣的程序,也能夠快速的在互聯網上下載文件,那一定是非常愉快的事情。下面我就講一講如何利用C#語言編寫一個支持多線程下載文件的程序,你會看到利用C#語言編寫網絡應用程序是多么的容易,從中也能體會到C#語言中強大的網絡功能。

首先介紹一下HTTP協議, HTTP亦即Hpyer Text Transfer Protocal的縮寫,它是現代互聯網上最重要的一種網絡協議,超文本傳輸協議位于TCP/IP協議的應用層,是一個面向無連接、簡單、快速的C/S結構的協議。HTTP的工作過程大體上分連接、請求、響應和斷開連接四個步驟。C#語言對HTTP協議提供了良好的支持,在類庫中提供了WebRequest和WebResponse類,這兩個類都包含在System.Net命名空間中,利用這兩個類可以實現很多高級的網絡功能,本文中多線程文件下載就是利用這兩個類實現的。 WebRequest和WebResponse都是抽象基類,因此在程序中不能直接作為對象使用,必須被繼承,實際使用中,可根據URI參數中的URI前綴選用它們合適的子類,對于HTTP這類URI,HttpWebRequest和HttpWebResponse類可以用于處理客戶程序同WEB服務器之間的HTTP通訊。

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類屬性為:ContentLength 既接收內容的長度。

有了以上的了解后,下面看看這兩個類的用法,要創建HttpWebRequest對象,不要直接使用HttpWebRequest的構造函數,而要使用WebRequest.Create方法初始化一個HttpWebRequest實例,如:

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

創建了這個對象后,就可以通過HttpWebRequest屬性,設置很多HTTP標頭字段的內容,如hwr.AddRange(100,1000);設置接收對象的范圍為100-1000字節。

HttpWebReques對象使用GetResponse()方法時,會返回一個HttpWebResponse對象,為提出HTTP返回報文信息,需要使用HttpWebResponse的GetResponseStream()方法,該方法返回一個Stream對象,可以讀取HTTP返回的報文,如:首先定義一個Strean 對象 public System.IO.Stream ns; 然后 ns=hwr.GetResponse ().GetResponseStream ();即可創建Stream對象。有了以上的準備知識后下面開始設計我們的多線程互聯網文件的下載程序,首先打開.Net集成開發環境,選擇“文件”、“新建”、“項目”,然后選擇“Visual C#項目”,在向導右邊列表框中選中“Windows應用程序”,輸入項目名稱,如本例為:httpftp,然后選擇“確定”按鈕,向導自動生成了一個 Windows應用程序項目。首先打開窗口設計器設計應用程序窗口,增加如下控件:

一個列表框 listBox1 三個文本標簽 label1-label3 三個文本框 textBox1-textBox3 一個開始接收按鈕 button1 設計好的窗口如下圖:

設計好的窗口 

控件定義代碼是:

  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;//網絡功能   
  2. using System.IO;//流支持  
  3. using System.Threading ;//線程支持  

增加如下的程序變量:

  1. public bool[] threadw; //每個線程結束標志  
  2. public string[] filenamew;//每個線程接收文件的文件名  
  3. public int[] filestartw;//每個線程接收文件的起始位置  
  4. public int[] filesizew;//每個線程接收文件的大小  
  5. public string strurl;//接受文件的URL  
  6. public bool hb;//文件合并標志  
  7. public int thread;//進程數  

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

  1. public class HttpFile  
  2. {  
  3.  public Form1 formm;  
  4.  public int threadh;//線程代號  
  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;//接收緩沖區  
  11.  public int nreadsize;//接收字節數  
  12.  public HttpFile(Form1 form,int thread)//構造方法  
  13.  {  
  14.   formm=form;  
  15.   threadh=thread;  
  16.  }  
  17.  ~HttpFile()//析構方法  
  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 ("進程"+threadh.ToString ()+"接收完畢!");  
  53.   formm.threadw[threadh]=true;  
  54.  }  
  55. }  

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

  1. private void button1_Click(object sender, System.EventArgs e)  
  2. {  
  3.  DateTime dt=DateTime.Now;//開始接收時間  
  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;//取得目標文件的長度  
  12.   request.Abort ();  
  13.  }  
  14.  catch (Exception er)  
  15.  {  
  16.   MessageBox.Show (er.Message );  
  17.  }  
  18.  // 接收線程數  
  19.  thread=Convert.ToInt32 (textBox4.Text .Trim().ToString (),10);  
  20.  //根據線程數初始化數組  
  21.  threadw=new bool [thread];  
  22.  filenamew=new string [thread];  
  23.  filestartw=new int [thread];  
  24.  filesizew=new int[thread];  
  25.  
  26.  //計算每個線程應該接收文件的大小  
  27.  int filethread=(int)filesize/thread;//平均分配  
  28.  int filethreade=filethread+(int)filesize%thread;//剩余部分由最后一個線程完成  
  29.  //為數組賦值  
  30.  for (int i=0;i< thread;i++)  
  31.  {  
  32.   threadw[i]=false;//每個線程狀態的初始值為假  
  33.   filenamew[i]=i.ToString ()+".dat";//每個線程接收文件的臨時文件名  
  34.   if (i< thread-1)  
  35.   {  
  36.    filestartw[i]=filethread*i;//每個線程接收文件的起始點  
  37.    filesizew[i]=filethread-1;//每個線程接收文件的長度  
  38.   }  
  39.   else 
  40.   {  
  41.    filestartw[i]=filethread*i;  
  42.    filesizew[i]=filethreade-1;  
  43.   }  
  44.  }  
  45.  //定義線程數組,啟動接收線程  
  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.  //啟動合并各線程接收的文件線程  
  55.  Thread hbth=new Thread (new ThreadStart (hbfile));  
  56.  hbth.Start ();  
  57. }  

合并文件的線程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)//有未結束線程,等待  
  9.    {  
  10.     hb=false;  
  11.     Thread.Sleep (100);  
  12.     break;  
  13.    }  
  14.   }  
  15.   if (hb==true)//所有線程均已結束,停止等待,  
  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;k< thread;k++)  
  26.  {  
  27.   fstemp=new FileStream (filenamew[k],System.IO.FileMode .Open);  
  28.   while (true)  
  29.   {  
  30.    readfile=fstemp.Read (bytes,0,512);  
  31.    if (readfile>0)  
  32.    {  
  33.     fs.Write (bytes,0,readfile);  
  34.    }  
  35.    else 
  36.    {  
  37.     break;  
  38.    }  
  39.   }  
  40.   fstemp.Close ();  
  41.  }  
  42.  fs.Close ();  
  43.  DateTime dt=DateTime.Now;  
  44.  textBox1.Text =dt.ToString ();//結束時間  
  45.  MessageBox.Show ("接收完畢!!!");  
  46. }  

至此,一個多線程下載文件的程序就大功告成了,注意在輸入本地文件名時,應按如下格式輸入:“c:\\test\\httpftp\\bin \\d.htm”,因”\”后的字符在C#中是轉義字符,線程數并非越大越好,一般5個線程就可以了,該程序在Visual Studio.Net 2002開發環境及Windows xp 上通過。

【編輯推薦】

  1. C#發送Email郵件的方法解析
  2. 解析C#中is和as操作符的用法
  3. C# Excel COM組件的使用
  4. 如何判斷C#字符串是全角還是半角
  5. C#語言規范之小結
責任編輯:book05 來源: VCKBASE
相關推薦

2011-05-19 11:20:08

2009-09-07 13:38:03

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

2010-07-01 15:55:54

FTP文件傳輸協議

2010-06-28 14:25:16

2009-08-28 16:43:57

C#多線程學習

2011-08-24 10:18:56

2009-08-26 18:13:55

C#多線程lock

2010-06-09 15:40:01

FTP文件傳輸協議

2010-06-28 11:15:45

BitTorrent協

2009-08-12 18:04:44

編寫C#多線程

2012-02-16 08:19:03

2012-04-05 13:24:30

2023-11-19 11:44:45

2009-09-04 15:09:48

C#多線程啟動Squa

2010-06-28 15:41:04

FTP文件傳輸協議

2010-06-09 15:55:20

FTP文件傳輸協議

2020-11-13 08:30:57

Socket

2024-12-30 06:00:00

C#線程編程

2013-08-21 13:34:52

MJPEG流傳輸C#開源C#

2024-05-10 07:44:23

C#進程程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区二区三区在线视频 | 噜噜噜噜狠狠狠7777视频 | 国产精品久久久久久久久久 | 久久99久久98精品免观看软件 | 亚洲精品中文字幕在线观看 | 99热这里都是精品 | 国产精品无码久久久久 | 91精品导航| 国产成人网| 羞羞网站在线观看 | 国产一区在线视频 | 99re视频在线观看 | 在线日韩精品视频 | 成人欧美一区二区三区 | 久久午夜精品 | 色综合一区二区三区 | 日本xx视频免费观看 | 久久国产精品久久久久久 | 国产精品国产精品国产专区不片 | 在线观看视频亚洲 | 国产一区免费视频 | 日本一区二区视频 | 欧美国产一区二区 | 国产农村一级国产农村 | 国产在线a | 日日干天天操 | 欧美日韩在线观看一区二区三区 | 午夜精品久久 | 日韩一区二区三区在线观看 | 亚洲视频www | 成人网视频| 久久国产精品一区二区三区 | 中文字幕 国产 | www.亚洲免费 | 日韩欧美精品在线 | 在线观看电影av | 日韩欧美网 | 99精品久久久久久中文字幕 | 三级黄视频在线观看 | 亚洲一区二区三区在线观看免费 | av网站观看 |