一.概述:
本文通過一個實例向大家介紹用c# builder進行internet通訊編程的一些基本知識。我們知道.net類包含了請求/響應層、應用協議層、傳輸層等層次。在本程序中,我們運用了位于請求/響應層的webrequest類以及webclient類等來實現高抽象程度的internet通訊服務。本程序的功能是完成文件的下載。
二.實現原理:
程序實現的原理比較簡單,主要用到了webclient類和filestream類。其中webclient類處于system.net名字空間中,該類的主要功能是提供向uri標識的資源發送數據和從uri標識的資源接收數據的公共方法。我們利用其中的downfile()方法將文件下載到本地。然后用filestream類的實例對象以數據流的方式將文件數據寫入本地文件。這樣就完成了文件的下載。
三.實現步驟:
1.首先,打開c# builder,file->new->c# application,name這里我們設為"download"。
2.主界界的設置。text設為“文件下載”,startposition設為centerscreen,maximizebox設為false,我們在主窗體上添加如下控件:兩個標簽控件label1,label2、一個文本框控件textbox1、一個按鈕控件button1以及一個進度條控件progressbar1。
label1:text為url;label2:text為下載進度;textbox1:text設為空;button1:text設為下載;
3.程序的編碼
//過程downfile,用于完成文件的下載
private void downfile()
{
string filename;
webclient downfile=new webclient();
long fbytes;
if (textbox1.text!="")
{
savefiledialog1.showdialog();
filename=savefiledialog1.filename;
if(filename!= "")
{
//取得文件大小
webrequest wr_request=webrequest.create(textbox1.text);
webresponse wr_response=wr_request.getresponse();
fbytes=wr_response.contentlength;
progressbar1.maximum=(int)fbytes;
progressbar1.step=1;
wr_response.close();
//開始下載數據
downfile.downloaddata(textbox1.text);
stream strm = downfile.openread(textbox1.text);
streamreader reader = new streamreader(strm);
byte[] mbyte = new byte[fbytes];
int allmybyte = (int)mbyte.length;
int startmbyte = 0;
while(fbytes>0)
{
int m = strm.read(mbyte,startmbyte,allmybyte);
if(m==0) break;
startmbyte+=m;
allmybyte-=m;
progressbar1.value+=m;
}
filestream fstrm = new filestream(filename,filemode.openorcreate,fileaccess.write);
fstrm.write(mbyte,0,startmbyte);
strm.close();
fstrm.close();
progressbar1.value=progressbar1.maximum;
}
} else
{
messagebox.show("沒有輸入要下載的文件!");
}
}
//雙擊“下載”按鈕,輸入以下代碼:
thread th = new thread(new threadstart(downfile));
th.start();
//完整的代碼如下:
using system;
using system.drawing;
using system.collections;
using system.componentmodel;
using system.windows.forms;
using system.data;
using system.net;
using system.io;
using system.threading;
namespace download
{
/// <summary>
/// summary description for winform.
/// </summary>
public class winform : system.windows.forms.form
{
/// <summary>
/// required designer variable.
/// </summary>
private system.componentmodel.container components = null;
private system.windows.forms.label label1;
private system.windows.forms.textbox textbox1;
private system.windows.forms.button button1;
private system.windows.forms.savefiledialog savefiledialog1;
private system.windows.forms.label label2;
private system.windows.forms.progressbar progressbar1;
public winform()
{
//
// required for windows form designer support
//
initializecomponent();
//
// todo: add any constructor code after initializecomponent call
//
}
/// <summary>
/// clean up any resources being used.
/// </summary>
protected override void dispose (bool disposing)
{
if (disposing)
{
if (components != null)
{
components.dispose();
}
}
base.dispose(disposing);
}
#region windows form designer generated code
/// <summary>
/// required method for designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void initializecomponent()
{
this.label1 = new system.windows.forms.label();
this.textbox1 = new system.windows.forms.textbox();
this.button1 = new system.windows.forms.button();
this.savefiledialog1 = new system.windows.forms.savefiledialog();
this.label2 = new system.windows.forms.label();
this.progressbar1 = new system.windows.forms.progressbar();
this.suspendlayout();
//
// label1
//
this.label1.location = new system.drawing.point(40, 40);
this.label1.name = "label1";
this.label1.size = new system.drawing.size(40, 16);
this.label1.tabindex = 0;
this.label1.text = "url:";
//
// textbox1
//
this.textbox1.location = new system.drawing.point(72, 36);
this.textbox1.name = "textbox1";
this.textbox1.size = new system.drawing.size(256, 21);
this.textbox1.tabindex = 1;
this.textbox1.text = "";
//
// button1
//
this.button1.location = new system.drawing.point(256, 120);
this.button1.name = "button1";
this.button1.tabindex = 2;
this.button1.text = "下載";
this.button1.click += new system.eventhandler(this.button1_click);
//
// label2
//
this.label2.location = new system.drawing.point(8, 80);
this.label2.name = "label2";
this.label2.size = new system.drawing.size(72, 23);
this.label2.tabindex = 3;
this.label2.text = "下載進度:";
//
// progressbar1
//
this.progressbar1.location = new system.drawing.point(72, 80);
this.progressbar1.name = "progressbar1";
this.progressbar1.size = new system.drawing.size(256, 16);
this.progressbar1.tabindex = 4;
//
// winform
//
this.autoscalebasesize = new system.drawing.size(6, 14);
this.clientsize = new system.drawing.size(360, 173);
this.controls.add(this.progressbar1);
this.controls.add(this.label2);
this.controls.add(this.button1);
this.controls.add(this.textbox1);
this.controls.add(this.label1);
this.maximizebox = false;
this.name = "winform";
this.startposition = system.windows.forms.formstartposition.centerscreen;
this.text = "文件下載";
this.resumelayout(false);
}
#endregion
/// <summary>
/// the main entry point for the application.
/// </summary>
[stathread]
static void main()
{
application.run(new winform());
}
private void downfile()
{
string filename;
webclient downfile=new webclient();
long fbytes;
if (textbox1.text!="")
{
savefiledialog1.showdialog();
filename=savefiledialog1.filename;
if(filename!= "")
{
//取得文件大小
webrequest wr_request=webrequest.create(textbox1.text);
webresponse wr_response=wr_request.getresponse();
fbytes=wr_response.contentlength;
progressbar1.maximum=(int)fbytes;
progressbar1.step=1;
wr_response.close();
//開始下載數據
downfile.downloaddata(textbox1.text);
stream strm = downfile.openread(textbox1.text);
streamreader reader = new streamreader(strm);
byte[] mbyte = new byte[fbytes];
int allmybyte = (int)mbyte.length;
int startmbyte = 0;
while(fbytes>0)
{
int m = strm.read(mbyte,startmbyte,allmybyte);
if(m==0) break;
startmbyte+=m;
allmybyte-=m;
progressbar1.value+=m;
}
filestream fstrm = new filestream(filename,filemode.openorcreate,fileaccess.write);
fstrm.write(mbyte,0,startmbyte);
strm.close();
fstrm.close();
progressbar1.value=progressbar1.maximum;
}
} else
{
messagebox.show("沒有輸入要下載的文件!");
}
}
private void button1_click(object sender, system.eventargs e)
{
thread th = new thread(new threadstart(downfile));
th.start();
}
}
}
4.按f9運行程序,輸入一下載地址,點“下載”按鈕試試。
四.結束語:
以上用一個簡單的例子向大家展示了如何用c# builder實現文件的下載,我們不難發現用c# builder進行internet通訊編程是非常方便的。在上面的程序中,我們僅僅用到了webclient類的一些方法,而webclient類不只是提供了文件下載的方法,還提供了文件上傳等方法,有興趣的讀者不妨自己試試,查查幫助。
程序中使用了多線程,這是因為webclient類占有的資源校大,在下載文件會使整個窗口的顯示不完整。如果不用多線程的話,下載文件的時候,你根本沒法移動窗口或進行其它的一些操作。
|
新聞熱點
疑難解答