熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用C#實現HTTP協議下的多線程文件傳輸

2013-11-13 12:21:08  來源: .NET編程 

  很多人都有過使用網絡螞蟻或網絡快車軟件下載互聯網文件的經歷這些軟件的使用可以大大加速互聯網上文件的傳輸速度減少文件傳輸的時間這些軟件為什麼有如此大的魔力呢?其主要原因是這些軟件都采用了多線程下載和斷點續傳技術如果我們自己來編寫一個類似這樣的程序也能夠快速的在互聯網上下載文件那一定是非常愉快的事情下面我就講一講如何利用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;//進程數


From:http://tw.wingwit.com/Article/program/net/201311/15726.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.