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

首頁(yè) > 編程 > C# > 正文

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

2023-05-12 12:29:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  很多人都有過(guò)使用網(wǎng)絡(luò)螞蟻或網(wǎng)絡(luò)快車軟件下載互聯(lián)網(wǎng)文件的經(jīng)歷,這些軟件的使用可以大大加速互聯(lián)網(wǎng)上文件的傳輸速度,減少文件傳輸?shù)臅r(shí)間。這些軟件為什么有如此大的魔力呢?其主要原因是這些軟件都采用了多線程下載和斷點(diǎn)續(xù)傳技術(shù)。如果我們自己來(lái)編寫一個(gè)類似這樣的程序,也能夠快速的在互聯(lián)網(wǎng)上下載文件,那一定是非常愉快的事情。下面我就講一講如何利用C#語(yǔ)言編寫一個(gè)支持多線程下載文件的程序,你會(huì)看到利用C#語(yǔ)言編寫網(wǎng)絡(luò)應(yīng)程序是多么的容易,從中也能體會(huì)到C#語(yǔ)言中強(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è)面向無(wú)連接、簡(jiǎn)單、快速的C/S結(jié)構(gòu)的協(xié)議。HTTP的工作過(guò)程大體上分連接、請(qǐng)求、響應(yīng)和斷開(kāi)連接四個(gè)步驟。C#語(yǔ)言對(duì)HTTP協(xié)議提供了良好的支持,在.NET類庫(kù)中提供了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)了很多通過(guò)HTTP訪問(wèn)WEB服務(wù)器上文件的高級(jí)功能。HttpWebRequest類對(duì)WebRequest中定義的屬性和方法提供支持,HttpWebRequest將發(fā)送到Internet資源的公共HTTP標(biāo)頭的值公開(kāi)為屬性,由方法或系統(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),程序員可以通過(guò)這些屬性方便的訪問(wèn)位于HTTP接收?qǐng)?bào)文標(biāo)頭字段中的信息,本例中用到的HttpWebResponse類屬性為:ContentLength 既接收內(nèi)容的長(zhǎng)度。

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

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

  創(chuàng)建了這個(gè)對(duì)象后,就可以通過(guò)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ì)象。有了以上的準(zhǔn)備知識(shí)后下面開(kāi)始設(shè)計(jì)我們的多線程互聯(lián)網(wǎng)文件的下載程序,首先打開(kāi)Visual Studio.Net集成開(kāi)發(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)目。首先打開(kāi)窗口設(shè)計(jì)器設(shè)計(jì)應(yīng)用程序窗口,增加如下控件:

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

  控件定義代碼是:

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;

  打開(kāi)Form1的代碼編輯器,增加如下的命名空間:

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

  增加如下的程序變量:

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

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

public class HttpFile
{
 public Form1 formm;
 public int threadh;//線程代號(hào)
 public string filename;//文件名
 public string strUrl;//接收文件的URL
 public FileStream fs;
 public HttpWebRequest request;
 public System.IO.Stream ns;
 public byte[] nbytes;//接收緩沖區(qū)
 public int nreadsize;//接收字節(jié)數(shù)
 public HttpFile(Form1 form,int thread)//構(gòu)造方法
 {
  formm=form;
  threadh=thread;
 }
 ~HttpFile()//析構(gòu)方法
 {
  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 ()+"開(kāi)始接收");
  fs=new FileStream (filename,System.IO.FileMode.Create);
  try
  {
   request=(HttpWebRequest)HttpWebRequest.Create (strUrl);
   //接收的起始位置及接收的長(zhǎng)度
   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 ("進(jìn)程"+threadh.ToString ()+"接收完畢!");
  formm.threadw[threadh]=true;
 }
}

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

private void button1_Click(object sender, System.EventArgs e)
{
 DateTime dt=DateTime.Now;//開(kāi)始接收時(shí)間
 textBox1.Text =dt.ToString ();
 strurl=textBox2.Text .Trim ().ToString ();
 HttpWebRequest request;
 long filesize=0;
 try
 {
  request=(HttpWebRequest)HttpWebRequest.Create (strurl);
  filesize=request.GetResponse ().ContentLength;//取得目標(biāo)文件的長(zhǎng)度
  request.Abort ();
 }
 catch (Exception er)
 {
  MessageBox.Show (er.Message );
 }
 // 接收線程數(shù)
 thread=Convert.ToInt32 (textBox4.Text .Trim().ToString (),10);
 //根據(jù)線程數(shù)初始化數(shù)組
 threadw=new bool [thread];
 filenamew=new string [thread];
 filestartw=new int [thread];
 filesizew=new int[thread];

 //計(jì)算每個(gè)線程應(yīng)該接收文件的大小
 int filethread=(int)filesize/thread;//平均分配
 int filethreade=filethread+(int)filesize%thread;//剩余部分由最后一個(gè)線程完成
 //為數(shù)組賦值
 for (int i=0;i<thread;i++)
 {
  threadw[i]=false;//每個(gè)線程狀態(tài)的初始值為假
  filenamew[i]=i.ToString ()+".dat";//每個(gè)線程接收文件的臨時(shí)文件名
  if (i<thread-1)
  {
   filestartw[i]=filethread*i;//每個(gè)線程接收文件的起始點(diǎn)
   filesizew[i]=filethread-1;//每個(gè)線程接收文件的長(zhǎng)度
  }
  else
  {
   filestartw[i]=filethread*i;
   filesizew[i]=filethreade-1;
  }
 }
 //定義線程數(shù)組,啟動(dòng)接收線程
 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 ();
 }
 //啟動(dòng)合并各線程接收的文件線程
 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)//有未結(jié)束線程,等待
   {
    hb=false;
    Thread.Sleep (100);
    break;
   }
  }
  if (hb==true)//所有線程均已結(jié)束,停止等待,
  {
   break;
  }
 }
 FileStream fs;//開(kāi)始合并
 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 ();//結(jié)束時(shí)間
 MessageBox.Show ("接收完畢!!!");

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美日韩在线网站| 国产精品密蕾丝袜| 二吊插入一穴一区二区| 国产精品亚洲四区在线观看| 最近2018中文字幕免费在线视频| 一区二区三区久久| www.日韩不卡电影av| 国产日韩亚洲欧美在线| 亚洲色图久久久| 五月天久久比比资源色| 草久久免费视频| 免费一区二区三区在线视频| 国产视频97| 亚洲欧美一区二区三区在线播放| 91玉足脚交白嫩脚丫在线播放| av免费网站在线| 亚洲一区二区三区欧美| 美腿丝袜在线亚洲一区| 最新国产麻豆精品| 亚洲午夜久久久| 色婷婷粉嫩av| 正在播放一区二区| 亚洲区精品久久一区二区三区| 俺去俺来也在线www色官网| 欧美xxx视频| 亚洲另类图片色| 91极品美女在线| www.日日夜夜| 欧美激情xxxx性bbbb| 日本在线成人| 国产精品久久久精品四季影院| 51精品久久久久久久蜜臀| 国产又黄又爽免费视频| 欧美日本亚洲韩国国产| 成人黄色免费视频| 尤物视频免费在线观看| 亚洲色图欧美激情| 佐山爱在线视频| 亚洲天天综合| 国产免费视频一区二区三区| 婷婷综合电影| 色女人在线视频| 亚洲精品乱码视频| 中文字幕有码热在线视频| 强迫凌虐淫辱の牝奴在线观看| 日韩在线视频网| 日本在线播放一区二区| 人与动物性xxxx| av毛片在线免费| 亚洲s色大片在线观看| 亚洲精品视频区| 日本aaa在线观看| 久久99精品波多结衣一区| 另类图片国产| 黑人巨大精品欧美一区二区奶水| 精品视频导航| 欧美视频日韩视频在线观看| www在线看| 中文字幕在线观看第二页| 亚洲综合一二三| 欧美 变态 另类 人妖| 99re国产| a√资源在线| 91视频免费入口| 在线观看亚洲a| 国产另类xxxxhd高清| 春暖花开亚洲一区二区三区| 日韩aaa久久蜜桃av| 一区二区自拍偷拍| 亚洲综合网狠久久| 色婷婷一区二区三区av免费看| 欧美激情三级免费| 色婷婷在线观看视频| 婷婷六月天在线| 97人人模人人爽视频一区二区| 日本人添下边视频免费| 欧美日韩123区| 91免费看片在线| 在线观看国产v片| 欧美成人精品一区二区| 欧美美乳在线| 精品人妻一区二区免费视频| 国产又大又粗又爽的毛片| 日本中文字幕片| 天堂在线观看av| 欧美日韩国产综合视频在线| 日韩美女在线看| 日本美女高潮视频| 久久久久亚洲av片无码下载蜜桃| 粉嫩av在线播放| 青青青草网站免费视频在线观看| 亚洲国产一区在线观看| 欧美三级日韩三级| 国产女人18毛片水真多成人如厕| 久久精品一二区| 韩国成人动漫| 一级黄色免费看| 黑人巨茎大战欧美白妇| 国产精品一区免费在线观看| 四虎影成人精品a片| 久久久视频6r| 国产精品一区二区久久不卡| 亚洲AV无码精品色毛片浪潮| 国产女主播视频一区二区| 日韩欧美国产网站| 青娱乐自拍偷拍| 91免费版网站入口| 国产综合成人久久大片91| 日韩中文字幕免费观看| 成人免费福利| 欧美三级午夜理伦三级小说| 深夜成人在线| 欧美知名女优| 91在线精品视频| 国产大学生自拍| 欧美v日韩v国产v| www.久久艹| 亚洲免费伊人电影| 欧美另类一区二区三区| 天海翼精品一区二区三区| 99免费在线观看视频| 免费欧美日韩国产三级电影| 最新版sss视频在线| 最新在线地址| 伊人久久大香线蕉av一区二区| 日韩伦理在线| 三级理论午夜在线观看| 日韩成人在线资源| 日韩欧美亚洲另类制服综合在线| 伊人久久在线观看| 91成人精品视频| 午夜欧美2019年伦理| 美女日韩在线中文字幕| ass极品水嫩小美女ass| 久久久国产成人精品| 亚洲美免无码中文字幕在线| 日韩和欧美一区二区| 国产黄色三级网站| 亚洲欧美制服丝袜| 国产福利电影网| 男人久久天堂| 女人扒开屁股爽桶30分钟| 首页欧美精品中文字幕| 丰满肉嫩西川结衣av| 老鸭窝一区二区久久精品| 91九色视频蝌蚪| www.久久久久久久久久久| 国产乱子伦视频一区二区三区| 国产精品三区在线| 亚洲精品成人久久久998| 成人黄色网免费| 综合精品久久久| 免费看特级毛片| 亚洲高清黄色| 国产精品美女午夜爽爽| 日韩毛片中文字幕| 国产在线精品国自产拍免费| 欧美日韩黄色| www.99re7| 黑巨人与欧美精品一区| 国产视频九色蝌蚪| 91久久夜色精品国产按摩| 青青青免费在线| 欧美日韩精品免费观看视欧美高清免费大片| 国产精品区一区二区三在线播放| 天天射夜夜骑| 日韩av在线综合| 在线视频一区二区三区在线播放| 狠狠久久综合婷婷不卡| 1769视频在线播放免费观看| 少妇极品熟妇人妻无码| 成人一区二区三区四区| 国产综合色视频| 国产欧美综合一区| 免费成人美女在线观看| 天堂网免费视频| www.成人69.com| 粉嫩av性色av蜜臀av网站| 欧美最猛性xxxx免费| 欧美精品九九久久| 西西大胆午夜视频| 无码人妻久久一区二区三区蜜桃| 欧美极品另类videosde| 亚洲美女久久| 91国偷自产一区二区三区成为亚洲经典| 亚洲男人天堂手机在线| 中国女人内谢69xxx视频| 久久久久国产精品夜夜夜夜夜| 3d动漫精品啪啪一区二区竹菊| 少妇按摩一区二区三区| 91大片在线观看| 宅男深夜免费观看视频| 国产精品女主播| av一区二区三区黑人| 亚洲第一av色| 欧美一区二区免费| 性xxxxfreexxxxx欧美丶| 夜夜嗨av一区二区三区网站四季av| 欧美一区,二区| 亚洲综合在线做性| 奇米影视亚洲狠狠色| 天天综合天天干| 日韩精品电影一区亚洲| 老熟妇仑乱视频一区二区| 色综合视频二区偷拍在线| 免费资源在线观看| 麻豆亚洲精品| 午夜精品爽啪视频| 日韩成人动漫| 国产在线观看第一页| 免费黄网站在线| 伊人久久一区二区| 又长又粗又大又爽| 国产xxx免费观看| 亚洲人成免费电影| 日韩成人午夜电影| 久久不射中文字幕| 色婷婷精品久久二区二区密| 午夜精品亚洲一区二区三区嫩草| 欧美日韩dvd在线观看| xxxxx日韩| 亚洲高清电影| 久草在线新资源| 在线视频91p| 亚洲美女黄色| 国产精品久久成人免费观看| 国产精品精品视频一区二区三区| 丝袜足控免费网站xx网站| 你懂的视频在线免费| 情se视频网在线观看| 91色porny| 希岛爱理中文字幕| 6080yy午夜一二三区久久| 999视频在线观看| 亚洲人成网站色在线观看| 欧美猛男gaygay网站| 国产成人无码www免费视频播放| 精品一区视频| 日韩av免费网站| 人妻换人妻a片爽麻豆| 亚洲成年人电影网站| 欧美成人精品在线观看| 最新精品国产| 色狠狠综合天天综合综合| 在线观看日韩羞羞视频| 欧美人与禽zozo性伦| 日韩一级黄色大片| 69视频免费看| 国产在线青青草| 亚洲国产婷婷香蕉久久久久久| 国产乱人伦精品一区二区在线观看| 日韩女优制服丝袜电影| 久久久免费高清视频| 色婷婷精品国产一区二区三区| 国产精品高清一区二区三区| 97精品久久久中文字幕免费| 日本在线观看一区二区| 国产女人高潮时对白| 日韩专区视频| 日本免费久久| 亚洲天堂网在线播放| 久久久久久久久久一区二区三区| av高清资源| 91在线看www| 国产三级国产精品国产国在线观看| 欧美成人剧情片在线观看| 国产精品h片在线播放| 国产一区日韩欧美| 五月婷婷激情久久| 麻豆高清免费国产一区| 国产精品视频一区二区三区| 国产日韩欧美视频在线观看| 91在线视频在线| 国产小视频福利在线| 97久久超碰| 一本久久精品一区二区| 国产69精品久久久久9999人| 国产一区二区视频免费观看| www国产在线| 一区二区三区四区高清精品免费观看| 97在线视频免费观看完整版| 天堂av8在线| 国内精品麻豆| 污视频在线免费观看一区二区三区| 成年女人免费又黄又爽视频| 国模私拍视频在线观看| 四季av一区二区凹凸精品| 十八禁一区二区三区| 91一区二区在线| 草莓视频性福宝| 国产麻豆永久视频| 日韩乱码一区二区三区| 日韩一区视频在线| 免费av网站在线看| 国产中文字幕视频| 欧美在线视频第一页| 激情综合色播五月| 久久久影视精品| 日韩欧美亚洲国产另类| 成人动漫一区二区| 精品资源在线看| 麻豆国产精品视频| 亚洲精品一二三四区| 久久婷婷色综合| 蜜桃成人av| 97久久视频| 美女扒开腿让男人桶爽久久软| 91精品国产综合久久久久久久久久| 免费在线观看国产精品| 丁香综合av| 日本免费在线观看视频| 亚洲人在线观看视频| 久久综合五月天婷婷伊人| 成人午夜电影久久影院| 色女人在线视频| 国产精品一区二区美女视频免费看| 日韩欧美精品一区二区三区| 美女毛片一区二区三区四区最新中文字幕亚洲| 欧美猛男男男激情videos| 精品欧美一区二区三区精品久久| 亚洲熟女毛茸茸| 国产精欧美一区二区三区| 亚洲电影成人成人影院| 欧美美女一区| 欧美成人精品福利在线视频| 亚洲一级片在线播放| 一区二区三区高清在线视频| 欧美刺激性大交免费视频|