用C 實現HTTP協議下的多執行緒檔案傳輸

2022-03-28 13:37:47 字數 3529 閱讀 4636

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屬性,設定很多http標頭字段的內容,如hwr.addrange(100,1000);設定接收物件的範圍為100-1000位元組。

乙個列表框 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;

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類,用於管理接收執行緒,其**如下:

~httpfile()//析構方法

public void receive()//接收執行緒

fs.close();

ns.close ();

}

catch (exception er)

formm.listbox1 .items.add ("程序"+threadh.tostring ()+"接收完畢!");

formm.threadw[threadh]=true;

}

}該類和form1類處於統一命名空間,但不包含在form1類中。下面定義「開始接收」按鈕控制項的事件響應函式:

private void button1_click(object sender, system.eventargs e)

catch (exception er)

// 接收執行緒數

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合併檔案的執行緒hbfile定義在form1類中,定義如下:

public void hbfile()

}

if (hb==true)//所有執行緒均已結束,停止等待,

}

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;k0)

else

}

fstemp.close ();

}

fs.close ();

datetime dt=datetime.now;

textbox1.text =dt.tostring ();//結束時間

messagebox.show ("接收完畢!!!");

}

用C 實現HTTP協議下的多執行緒檔案傳輸

控制項定義 是 public system.windows.forms.listbox listbox1 private system.windows.forms.label label1 private system.windows.forms.textbox textbox1 private s...

Linux下http協議實現 C

include include include string h include include socket h include errno h include include include include include include ctype h int main int argc,ch...

Windows下C 實現多執行緒

有時候我們想在乙個類中實現多執行緒,主線程在某些時刻獲得資料,可以 通知 子執行緒去處理,然後把結果返回。下面的例項是主線程每隔2s產生10個隨機數,將這10隨機數傳給多執行緒類,讓它接收到資料後馬上列印出來。首先看類的定義 cpp view plain copy print?pragma once...