日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C# > 正文

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

2023-05-12 12:29:41
字體:
供稿:網(wǎng)友

  很多人都有過使用網(wǎng)絡(luò)螞蟻或網(wǎng)絡(luò)快車軟件下載互聯(lián)網(wǎng)文件的經(jīng)歷,這些軟件的使用可以大大加速互聯(lián)網(wǎng)上文件的傳輸速度,減少文件傳輸?shù)臅r間。這些軟件為什么有如此大的魔力呢?其主要原因是這些軟件都采用了多線程下載和斷點續(xù)傳技術(shù)。如果我們自己來編寫一個類似這樣的程序,也能夠快速的在互聯(lián)網(wǎng)上下載文件,那一定是非常愉快的事情。下面我就講一講如何利用C#語言編寫一個支持多線程下載文件的程序,你會看到利用C#語言編寫網(wǎng)絡(luò)應(yīng)程序是多么的容易,從中也能體會到C#語言中強大的網(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)用層,是一個面向無連接、簡單、快速的C/S結(jié)構(gòu)的協(xié)議。HTTP的工作過程大體上分連接、請求、響應(yīng)和斷開連接四個步驟。C#語言對HTTP協(xié)議提供了良好的支持,在.NET類庫中提供了WebRequest和WebResponse類,這兩個類都包含在System.Net命名空間中,利用這兩個類可以實現(xiàn)很多高級的網(wǎng)絡(luò)功能,本文中多線程文件下載就是利用這兩個類實現(xiàn)的。 WebRequest和WebResponse都是抽象基類,因此在程序中不能直接作為對象使用,必須被繼承,實際使用中,可根據(jù)URI參數(shù)中的URI前綴選用它們合適的子類,對于HTTP這類URI,HttpWebRequest和HttpWebResponse類可以用于處理客戶程序同WEB服務(wù)器之間的HTTP通訊。

  HttpWebRequest類實現(xiàn)了很多通過HTTP訪問WEB服務(wù)器上文件的高級功能。HttpWebRequest類對WebRequest中定義的屬性和方法提供支持,HttpWebRequest將發(fā)送到Internet資源的公共HTTP標頭的值公開為屬性,由方法或系統(tǒng)設(shè)置,常用的由屬性或方法設(shè)置的HTTP標頭為:接受, 由Accept屬性設(shè)置, 連接, 由Connection屬性和KeepAlive屬性設(shè)置, Content-Length, 由ContentLength屬性設(shè)置, Content-Type, 由ContentType屬性設(shè)置, 范圍, 由AddRange方法設(shè)置. 實際使用中是將標頭信息正確設(shè)置后,傳遞到WEB服務(wù)器,WEB服務(wù)器根據(jù)要求作出回應(yīng)。

  HttpWebResponse類繼承自WebResponse類,專門處理從WEB服務(wù)器返回的HTTP響應(yīng),這個類實現(xiàn)了很多方法,具有很多屬性,可以全面處理接收到的互聯(lián)網(wǎng)信息。在HttpWebResponse類中,對于大多數(shù)通用的HTTP標頭字段,都有獨立的屬性與其對應(yīng),程序員可以通過這些屬性方便的訪問位于HTTP接收報文標頭字段中的信息,本例中用到的HttpWebResponse類屬性為:ContentLength 既接收內(nèi)容的長度。

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

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

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

  HttpWebReques對象使用GetResponse()方法時,會返回一個HttpWebResponse對象,為提出HTTP返回報文信息,需要使用HttpWebResponse的GetResponseStream()方法,該方法返回一個Stream對象,可以讀取HTTP返回的報文,如:首先定義一個Strean 對象 public System.IO.Stream ns; 然后 ns=hwr.GetResponse ().GetResponseStream ();即可創(chuàng)建Stream對象。有了以上的準備知識后下面開始設(shè)計我們的多線程互聯(lián)網(wǎng)文件的下載程序,首先打開Visual Studio.Net集成開發(fā)環(huán)境,選擇“文件”、“新建”、“項目”,然后選擇“Visual C#項目”,在向?qū)в疫吜斜砜蛑羞x中“Windows應(yīng)用程序”,輸入項目名稱,如本例為:httpftp,然后選擇“確定”按鈕,向?qū)ё詣由闪艘粋€Windows應(yīng)用程序項目。首先打開窗口設(shè)計器設(shè)計應(yīng)用程序窗口,增加如下控件:

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

  控件定義代碼是:

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;//網(wǎng)絡(luò)功能
using System.IO;//流支持
using System.Threading ;//線程支持

  增加如下的程序變量:

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

  定義一個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;//接收緩沖區(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 ()+"開始接收");
  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類處于統(tǒng)一命名空間,但不包含在Form1類中。下面定義“開始接收”按鈕控件的事件響應(yīng)函數(shù):

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 );
 }
 // 接收線程數(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];

 //計算每個線程應(yīng)該接收文件的大小
 int filethread=(int)filesize/thread;//平均分配
 int filethreade=filethread+(int)filesize%thread;//剩余部分由最后一個線程完成
 //為數(shù)組賦值
 for (int i=0;i<thread;i++)
 {
  threadw[i]=false;//每個線程狀態(tài)的初始值為假
  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;
  }
 }
 //定義線程數(shù)組,啟動接收線程
 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)//有未結(jié)束線程,等待
   {
    hb=false;
    Thread.Sleep (100);
    break;
   }
  }
  if (hb==true)//所有線程均已結(jié)束,停止等待,
  {
   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 ();//結(jié)束時間
 MessageBox.Show ("接收完畢!!!");

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
中文字幕欧美日韩在线| 日韩在线视频中文字幕| 精品国产99| 国产 欧美 在线| 91精品国产自产在线丝袜啪| 伊人网站在线| 国产一级片网站| 欧美日韩中文字幕精品| 日韩欧美综合在线视频| 99精品视频国产| 日韩国产欧美| 亚洲久草视频| 欧美1234区| 一二三区精品视频| 欧美日本精品| 国产 中文 字幕 日韩 在线| 日韩三级精品电影久久久| 中文字幕一区二区三区精品| 国产一卡2卡3卡4卡网站免费| 红桃视频国产一区| 欧美一级日韩一级| 亚洲一区视频在线观看视频| 91av久久久| 国产一区精品在线| 日韩欧美综合视频| 最近中文字幕第一页| 欧美熟妇乱码在线一区| 欧美日韩第一区日日骚| 中文在线视频观看| 国产v日产∨综合v精品视频| 欧美日韩免费视频| 日韩欧美亚洲日产国| 999在线视频| 国产欧美高清在线| 亚洲精品欧美二区三区中文字幕 | 欧美日韩中文国产| 欧美不卡一二三| 久精品在线观看| 精品综合久久久久| 欧美性生交大片免费| 视频一区三区| 亚洲一区精品电影| 亚洲免费观看视频| 中文字幕久久精品| 99精品999| www.狠狠干| 精品福利二区三区| 91精品国产免费| 欧美日韩乱国产| 91九色在线播放| 亚洲а∨精品天堂在线| 不卡中文一二三区| 中文字幕 亚洲一区| 欧美日韩三级一区| 一区二区三区久久| 欧美国产一级片| 成人久久久久| 黄色一级大片在线免费看国产一| 亚洲第一页中文字幕| 日韩精品第一区| 天天综合色天天| 99精品视频国产| 色妇色综合久久夜夜| 日韩www在线| 内射国产内射夫妻免费频道| 国产日韩在线视频| 精品久久久三级| 91精品国产丝袜白色高跟鞋| 欧美日韩国产在线播放| 在线观看一区日韩| 国产高清在线观看| 成人一区二区不卡免费| 91欧美在线| 亚洲成在线观看| 欧美日韩国产首页在线观看| 中文字幕第一页在线播放| 久久精品视频免费看| 国产色在线视频| 欧美黄页在线免费观看| 国产69精品久久久久孕妇国产69久久 | 欧洲一级精品| 亚洲国产无线乱码在线观看 | a视频免费在线观看| 精品国产欧美日韩不卡在线观看| 日韩视频在线观看一区| 久久91精品久久久久久秒播| 国产在线视频一区二区| 日韩不卡一二区| 日本亚洲欧美天堂免费| 91精品综合久久久久久| 日韩中文字幕综合| 麻豆一区二区99久久久久| 亚洲国产午夜精品| 日本不卡免费高清视频| 精品一二线国产| 日韩欧美在线综合网| 交视频在线观看国产| 二区视频在线观看| 天天综合色天天| 99精品在线播放| 日韩欧美在线精品| 国产最新在线| 日韩高清不卡一区| 国产激情在线| 一区二区三区精品在线| 国产成人综合av| 国产在线观看精品| 国产福利免费在线观看| 精品久久在线观看| 欧美1区免费| 国产香蕉免费精品视频| 日韩中文字幕观看| 美女在线视频一区| www.精品视频| 午夜少妇久久久久久久久| www.老鸭窝.com| 亚洲娇小xxxx欧美娇小| 日韩国产一区| 国产高清精品在线| 亚洲大片精品永久免费| xxxxx性| 一本一道综合狠狠老| 久久精品日韩无码| 国产欧美日韩中文久久| 亚洲视频 中文字幕| 欧美久久久网站| 久久婷婷亚洲| 欧美精选午夜久久久乱码6080| 亚洲成av人片| 欧美日韩在线视频首页| 精品精品久久| 日韩精品视频在线| 日韩欧美一二三| 亚洲日产av中文字幕| 日韩不卡一二区| 国产高清大尺度一区二区不卡| 午夜精品免费视频| 国产在线欧美| 99精品一级欧美片免费播放| 中文字幕在线精品| 国产日韩av一区| 91精品国产乱码久久蜜臀| 午夜黄色小视频| 欧美在线亚洲一区| 三级网站免费观看| 国产在线拍偷自揄拍精品| 91精品国产入口| 亚洲一区日韩精品中文字幕| 中文字幕线观看| 人妻一区二区三区免费| 精品久久91| 欧美日韩国产一级片| 91精品视频播放| 欧美日韩综合在线| 欧美日韩中文字幕在线| 国产午夜在线观看| 91精品国产自产在线丝袜啪| 一区二区三区精品久久久| 1024国产在线| 精品国产乱码一区二区| 国产欧美久久久久久久久| 国产高清精品二区| 欧美三级三级三级爽爽爽| 日韩免费电影网站| 交视频在线观看国产| 日韩三级一区二区| 久久久精品日韩欧美| 欧美日韩高清不卡| 黄色一区二区在线观看| 日韩视频在线免费播放| 另类专区欧美| 日韩福利视频导航| 国产天堂素人系列在线视频| 欧美日韩中文字幕一区| 深夜福利亚洲| 日韩网站中文字幕| 一区二区三区久久| 精品婷婷伊人一区三区三| 亚洲福利精品视频| 91av久久久| 中文字幕精品在线| 久久精品免费在线观看| 日韩欧美专区在线| 欧美不卡123| 一区二区日韩免费看| 国产中文在线| 久久精品国产2020观看福利| 在线国产三级| 日韩三级精品| 在线观看免费国产成人软件| 国产不卡在线| 国产网站av| 国产亚洲视频中文字幕视频| 国产欧美日韩在线看| 中文字幕4区| 国产一区日韩欧美| 一区二区在线观| 日韩欧美国产午夜精品| 欧美日韩在线视频免费观看 | 欧美亚洲专区| 欧美日韩在线视频首页| 精品av中文字幕在线毛片| 九一久久久久久| av中文资源在线| 精品在线一区二区| 日本精品在线中文字幕| 欧美亚洲天堂| 一区二区国产在线| 在线看的av| 中文字幕亚洲视频| 区日韩二区欧美三区| 亚洲黄色片在线观看| 国产黄色小视频| 欧美中文字幕视频| 国产高清一级片| 中文欧美字幕免费| 亚洲国产欧美久久| 日韩精品高清不卡| 国产一区成人| 国产欧美日韩最新| 精品国产乱码久久久久久牛牛| 亚洲区中文字幕| 日韩中文字幕网| 欧美日韩高清一区二区| 亚洲制服一区| 日韩欧美成人一区二区三区| 欧美日韩综合在线观看| 欧美日韩高清在线一区| 日韩欧美亚洲区| 亚洲 国产 欧美 日韩| 国产午夜精品久久| 国产欧美综合在线观看第十页| 中文字幕欧美亚洲| 国产高清在线观看| 欧美日韩亚洲不卡| 亚洲午夜91| 99精品999| 中文在线视频| 国产欧亚日韩视频| av免费观看国产| 久久精品女人| 日韩视频中文| 欧美日韩综合视频网址| 亚洲 国产 欧美 日韩| 日韩欧美国产午夜精品| 中文精品在线| 久久99蜜桃精品| 欧美日韩中文| 国产高清一级片| 日韩中文在线字幕| 成人无遮挡免费网站视频在线观看 | 日韩一二三四区| 欧美日韩亚洲第一| 欧美日韩视频网站| 国产精品一区二区三区免费观看| 日韩不卡一二三区| 日韩精品在线网站| 亚洲一区中文| 亚洲va中文字幕| 中文字幕在线视频第一页| 一区二区不卡在线播放| 精品1区2区3区| 日韩欧美中文字幕视频| 日本黄色一区二区| 欧美一级在线免费| 国产资源在线观看| 日韩激情一区| 日韩欧美中文字幕精品| 久久99精品久久久久久青青日本| 欧美成人一区二区| 欧美日韩亚洲一| 欧美亚洲视频在线看网址| 亚洲一区精品在线| 欧美三级日本三级少妇99| 国产欧美日韩中文| 91精品久久久久久久久久| av不卡免费看| 粉嫩喷白浆久久| 韩国av一区二区| av免费在线网站| 久久久精品福利| 婷婷中文字幕一区三区| 欧美日韩一级视频| av免费观看网站| 日韩欧美在线中字| www.日韩免费| 亚洲第一网中文字幕| 国产免费电影网站入口| 91久久在线| 高清日韩中文字幕| 国产一区不卡精品| 欧美日韩人人澡狠狠躁视频| 日韩欧美在线第一页| 国产精久久久久| 欧美中文字幕精品| 精品婷婷伊人一区三区三| 91精品视频免费在线观看| 日韩va亚洲va欧洲va国产| 国产三级在线观看视频| 中文字幕欧美日韩va免费视频| 91精品国产91久久| 欧美三级中文字幕在线观看| 亚洲一区在线观看网站| 精品日韩99亚洲| 男人的天堂网av| 韩国v欧美v日本v亚洲| 中文字幕欧美人妻精品一区蜜臀| 91欧美日韩麻豆精品| 午夜亚洲福利| 欧美日韩高清一区二区| 久久精品网站免费观看| 黄色欧美日韩| 在线黄色国产电影| 91精品久久久久久久久久| 欧美日韩激情一区| 国产99在线 | 亚洲| 一区二区三区在线|网站| 久久精品久久精品亚洲人| 亚洲成在线观看| 欧洲精品在线视频| 亚洲国产欧美日韩在线| 日韩在线视频二区| 国产95在线|亚洲| 日韩视频在线观看视频| 国产最顶级的黄色片在线免费观看| 国产午夜精品全部视频播放| 最近中文av字幕在线中文| 人成免费在线视频| 亚洲一区激情| 中文字幕视频在线免费欧美日韩综合在线看| 一区二区三区在线|网站| 精品网站999| 精品免费久久久| 黄色一区二区在线观看| 中文字幕欧美日韩在线不卡| 国产黄色精品| 一区二区三区视频网站| 最近高清中文在线字幕在线观看 | 久久精品免费看| 国产在线观看a| 欧美日韩精品久久久| 国产一区 二区 三区一级| 亚洲一区中文在线| 欧美日韩国产不卡| 在线国产99| 日韩欧美资源站| 国产欧美久久久| 国产一卡2卡3卡四卡网站| 中文字幕国产亚洲| 久久99精品国产| 91久久精品网| 亚洲福利一区| 欧美日韩中文字幕| 欧美一级久久久久久久久大| 午夜成人鲁丝片午夜精品| 亚洲综合在线电影| 免费视频一区三区| 中文字幕视频在线免费欧美日韩综合在线看| 国产成人日日夜夜| 刘玥91精选国产在线观看| 国产www.大片在线| 中文字幕精品亚洲| 亚洲一区精品电影| 日韩精品视频在线| 日韩欧美在线不卡| 日韩三级一区二区| 国产欧美亚洲一区| 亚洲欧美中文字幕| 国产视频不卡| 日韩欧美在线精品| 91吃瓜在线观看| 国产在线www| 久久福利视频一区二区| 欧美日韩国产影片| 欧美日韩国产在线| 日韩亚洲欧美中文三级| 日韩欧美亚洲视频| 国产手机视频一区二区| 国产欧美三级| 一级日韩一级欧美| 91精品国产综合久久精品| 日韩高清不卡| 麻豆一区二区99久久久久| 99国产一区| 欧美三级精品| 亚洲v中文字幕| 92久久精品| 99久久精品国产成人一区二区| 国产在线二区| 亚洲综合视频一区| 欧美一级免费看| 日本a口亚洲| 欧美日韩在线视频一区| 精品在线一区二区| 日韩中文字幕在线视频播放| 国产色在线视频| 欧美一级在线观看| 日韩中文字幕精品视频| 精品视频在线导航| 91精品国产手机|