亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2023-05-12 12:29:41
字體:
來源:轉載
供稿:網友

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

  首先介紹一下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通訊。

  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實例,如:

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對象。有了以上的準備知識后下面開始設計我們的多線程互聯網文件的下載程序,首先打開Visual Studio.Net集成開發環境,選擇“文件”、“新建”、“項目”,然后選擇“Visual C#項目”,在向導右邊列表框中選中“Windows應用程序”,輸入項目名稱,如本例為:httpftp,然后選擇“確定”按鈕,向導自動生成了一個Windows應用程序項目。首先打開窗口設計器設計應用程序窗口,增加如下控件:

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

  控件定義代碼是:

public System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox1
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox textBox4;

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

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=(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;i<thread;i++)
 {
  threadw[i]=false;//每個線程狀態的初始值為假
  filenamew[i]=i.ToString ()+".dat";//每個線程接收文件的臨時文件名
  if (i<thread-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;j<thread;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;i<thread;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.Create);
 for (int k=0;k<thread;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 ("接收完畢!!!");

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久国产精品一区| 国产午夜精品美女视频明星a级| 亚洲天堂网站在线观看视频| 亚洲小视频在线观看| 久久久精品免费视频| 在线不卡国产精品| 日韩精品中文字幕视频在线| 国产精品视频精品| 欧美亚洲另类激情另类| 日韩精品视频在线播放| 亚洲精品国产精品国自产观看浪潮| 欧美日韩加勒比精品一区| 81精品国产乱码久久久久久| 色综合色综合久久综合频道88| 欧美富婆性猛交| 日韩电影免费在线观看| 欧美肥老妇视频| 亚洲春色另类小说| 亚洲一区二区久久久久久| 精品视频久久久久久久| 狠狠躁夜夜躁人人爽超碰91| 国产精品69精品一区二区三区| 亚洲色图色老头| 日韩欧亚中文在线| 国产欧美日韩中文字幕| 日韩中文字幕国产精品| 国产成人亚洲综合| 日韩av不卡电影| 久久成人精品电影| 国产精品视频自在线| 4p变态网欧美系列| 久久久在线视频| 中文字幕日韩精品在线观看| 黑人巨大精品欧美一区二区一视频| 日韩欧美在线视频| 亚洲成人网av| 欧美一级淫片videoshd| 精品国产一区二区三区久久狼5月| 国产乱人伦真实精品视频| 国产亚洲精品91在线| 8050国产精品久久久久久| 欧美午夜激情在线| 欧美午夜性色大片在线观看| 好吊成人免视频| 欧美午夜视频一区二区| 亚洲视频在线视频| 日韩免费中文字幕| 欧美高清视频在线观看| 91在线免费视频| 一本色道久久88综合日韩精品| 欧美麻豆久久久久久中文| 97视频在线观看视频免费视频| 欧美一级片一区| 久久视频在线免费观看| 亚洲人成网站在线播| 91精品免费久久久久久久久| 91热精品视频| 色先锋资源久久综合5566| 日韩免费观看视频| 国产精欧美一区二区三区| 欧美日韩精品在线观看| 日韩成人激情影院| 国产精品国产三级国产专播精品人| 91久久精品国产91久久性色| 欧美激情xxxxx| 91视频免费在线| 一区二区三区亚洲| 亚洲精品在线视频| 日韩综合视频在线观看| 高清一区二区三区四区五区| 久久久久久亚洲精品不卡| 欧美精品videos| 国产精品久久久久久婷婷天堂| 色妞在线综合亚洲欧美| 亚洲激情视频网| 久久免费视频观看| 国产国语videosex另类| 亚洲大胆美女视频| 精品视频在线播放色网色视频| 97av在线视频| 亚洲综合色激情五月| 欧美日韩一区二区在线| 久久精品国产成人| 91精品国产综合久久久久久久久| 国产性猛交xxxx免费看久久| 国产日本欧美一区| 欧美日韩免费一区| 国产亚洲欧美日韩一区二区| 亚洲精品国产免费| 亚洲美女动态图120秒| 亚洲一区第一页| 国产精品亚发布| 亚洲免费视频一区二区| 久久久亚洲国产天美传媒修理工| 亚洲一区二区三区视频播放| 91欧美精品午夜性色福利在线| 91av在线国产| 亚洲午夜av电影| 亚洲欧美另类自拍| 成人性生交大片免费看小说| 2020久久国产精品| 精品欧美激情精品一区| 97视频在线观看网址| 中文字幕亚洲天堂| 美日韩精品视频免费看| 久久色免费在线视频| 国产精品亚洲欧美导航| 97国产真实伦对白精彩视频8| 少妇av一区二区三区| 亚洲图片在区色| 91精品国产91| 92福利视频午夜1000合集在线观看| 亚洲人a成www在线影院| 成人在线国产精品| 91久久夜色精品国产网站| 日韩电影免费在线观看中文字幕| 激情久久av一区av二区av三区| 色悠悠久久88| 国产人妖伪娘一区91| 日韩av在线最新| 欧美夫妻性生活视频| 韩日精品中文字幕| 日韩中文字幕第一页| 日韩av电影中文字幕| 精品国产电影一区| 欧美亚洲激情在线| 91久久中文字幕| 高清一区二区三区四区五区| 久久久久久久久久久久久久久久久久av| 狠狠躁天天躁日日躁欧美| 国产精品偷伦免费视频观看的| 91在线无精精品一区二区| 国产欧美日韩专区发布| 国产精品91久久久久久| 91伊人影院在线播放| 亚洲精品资源美女情侣酒店| 1769国内精品视频在线播放| 亚洲欧美一区二区激情| 国产精品久久久久久一区二区| 亚洲一区二区久久久久久久| 亚洲自拍偷拍区| 国产在线拍偷自揄拍精品| 在线亚洲欧美视频| 亚洲伊人久久大香线蕉av| 国产日韩精品在线观看| 欧美激情亚洲综合一区| 国产日本欧美一区二区三区| 欧美一区二区色| 亚洲人在线视频| 97av在线影院| 色悠悠久久88| 成人免费看片视频| 国产精品一二区| 国产精品久久久久影院日本| 欧美亚洲第一页| 日韩a**站在线观看| 亚洲天堂精品在线| 亚洲精品suv精品一区二区| 欧美裸体xxxxx| 69av在线播放| 国产精品日韩电影| 91九色视频导航| 97精品视频在线播放| 亚洲精品福利在线观看|