|
<p >本文通过一个实例向大家介绍用C#进行Internet通讯编程的一些基本知识。我们知道.Net类包含了请求/响应层、应用协议层、传输层等层次。在本程序中,我们运用了位于请求/响应层的WebRequest类以及WebClient类等来实现高抽象程度的Internet通讯服务。本程序的功能是完成网络文件的下载。<p ><center><font color="#000099"><strong>实现原理</strong></font></center><p >程序实现的原理比较简单,主要用到了WebClient类和FileStream类。其中WebClient类处于System.Net名字空间中,该类的主要功能是提供向URI标识的资源发送数据和从URI标识的资源接收数据的公共方法。我们利用其中的DownloadFile()方法将网络文件下载到本地。然后用FileStream类的实例对象以数据流的方式将文件数据写入本地文件。这样就完成了网络文件的下载。<p ><center><font color="#000099"><strong>实现步骤</strong></font></center><p >首先,打开Visual Studio.Net,新建一个Visual C#Windows应用程序的工程,不妨命名为“MyGetCar”。<p >接着,布置主界面。我们先往主窗体上添加如下控件:两个标签控件、两个文本框控件、一个按钮控件以及一个状态栏控件。设置各控件属性如下:<p ><ccid_nobr><center><table border="1" cellpadding="1" cellspacing="0" class="content" width="484"><tr><td class="content"><b>控件类型</b></td><td class="content"><b>控件名称</b></td><td class="content"><b>属性类型</b></td><td class="content"><b class="content">属性值</b></td></tr><tr><td>主窗体</td><td>Form1</td><td>Text属性</td><td>文件下载器</td></tr><tr><td rowspan="4">标签控件</td><td rowspan="2">Label1</td><td>Text属性</td><td>文件地址:</td></tr><tr><td>TextAlign属性</td><td>MiddleRight</td></tr><tr><td rowspan="2">Label2</td><td>Text属性</td><td>另存到:</td></tr><tr><td>TextAlign属性</td><td>MiddleRight</td></tr><tr><td rowspan="2">文本框控件</td><td>srcAddress</td><td>Text属性</td><td>(空)</td></tr><tr><td>tarAddress</td><td>Text属性</td><td>(空)</td></tr><tr><td>按钮控件</td><td rowspan="2">Start</td><td>FlatStyle属性</td><td>Flat</td></tr><tr><td> </td><td>Text属性</td><td>开始下载</td></tr><tr><td>状态栏控件</td><td>StatusBar</td><td>Text属性</td><td>(空)</td></tr></table></center></ccid_nobr><p >其他属性可为默认值,最终的主窗体如下图所示:<p ><center></center><p >完成主窗体的设计,我们接着完成代码的编写。<p >在理解了基本原理的基础上去完成代码的编写是相当容易。程序中我们主要用到的是WebClient类,不过在我们调用WebClient类的实例对象前,我们需要用WebRequest类的对象发出对统一资源标识符(URI)的请求。<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>try { WebRequest myre=WebRequest.Create(URLAddress); } catch(WebException exp) { MessageBox.Show(exp.Message,&quot;Error&quot;); }</ccid_code></pre></td></tr></table></ccid_nobr><p >这是一个try-catch语句,try块完成向URI的请求,catch块则捕捉可能的异常并显示异常信息。其中的URLAddress为被请求的网络主机名。<p >在请求成功后,我们就可以运用WebClient类的实例对象中的DownloadFile()方法实现文件的下载了。其函数原型如下:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>public void DownloadFile( string address, string fileName);</ccid_code></pre></td></tr></table></ccid_nobr><p >其中,参数address为从中下载数据的 URI,fileName为要接收数据的本地文件的名称。<p >之后我们用OpenRead()方法来打开一个可读的流,该流完成从具有指定URI的资源下载数据的功能。其函数原型如下:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>public Stream OpenRead(string address);</ccid_code></pre></td></tr></table></ccid_nobr><p >其中,参数address同上。<p >最后就是新建一个StreamReader对象从中读取文件的数据,并运用一个while循环体不断读取数据,只到读完所有的数据。<p >还有在使用以上方法时,你将可能需要处理以下几种异常:<p >● WebException:下载数据时发生错误。<p >● UriFormatException:通过组合 BaseAddress、address 和 QueryString 所构成的 URI 无效。<p >这部分的代码如下:(client为WebClient对象,在本类的开头处声明即可)<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>statusBar.Text = &quot;开始下载文件...&quot;; client.DownloadFile(URLAddress,fileName); Stream str = client.OpenRead(URLAddress); StreamReader reader = new StreamReader(str); byte[] mbyte = new byte[100000]; int allmybyte = (int)mbyte.Length; int startmbyte = 0; statusBar.Text = &quot;正在接收数据...&quot;; while(allmybyte&gt;0) { int m = str.Read(mbyte,startmbyte,allmybyte); if(m==0) break; startmbyte+=m; allmybyte-=m; }</ccid_code></pre></td></tr></table></ccid_nobr><p >完成了文件数据的读取工作后,我们运用FileStream类的实例对象将这些数据写入本地文件中:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>FileStream fstr = new FileStream(Path,FileMode.OpenOrCreate,FileAccess.Write);fstr.Write(mbyte,0,startmbyte);</ccid_code></pre></td></tr></table></ccid_nobr><p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页>></span></p></p> |
|