首先介紹一下HTTP協議,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通訊。
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類中。下面定義“開始接收”按鈕控件的事件響應函數: