VisualC#实现自定义组件的设计.docx
《VisualC#实现自定义组件的设计.docx》由会员分享,可在线阅读,更多相关《VisualC#实现自定义组件的设计.docx(14页珍藏版)》请在冰豆网上搜索。
![VisualC#实现自定义组件的设计.docx](https://file1.bdocx.com/fileroot1/2022-11/16/97c43647-c521-494f-9625-e0c3538a952e/97c43647-c521-494f-9625-e0c3538a952e1.gif)
VisualC#实现自定义组件的设计
.前言
VisualC#作为一门新兴的编程语言,具有许多其它语言无法比拟的优点。
它既有VB的快速简洁,同
时又不失C++的高效性能,而且作为一门基于组件编程的语言,它在组件编程方面有着相当强大和完善的功能。
本文笔者就通过运用VisualC#编写一个Pop3邮件接收组件向大家介绍如何用VisualC#进行组件编
程以及编程过程中的一些方法和技巧,最后还给出了一个对该Pop3组件进行测试的WindowsForms程序。
二.基本原理
要完成一个Pop3组件,就要完成对该组件的属性(Property)、方法(Method)和事件(Event)等的
设计。
属性是一个组件的重要特征,一个组件一般有多项属性。
我们可以通过get和set取得和设置各个属
性的值。
完成了各个属性的设置,我们可以通过该组件的各种方法进行相应的操作。
而事件则是在某些特定的消息下触发的。
在C#中,我们用代表(delegate)进行事件的声明。
在该Pop3组件中,我们为其添加了主机名(Host)、端口号(Port)、用户名(UserName)、密码(Password)、邮件数目(NumOfMails)、邮件大小(TotalSize)等属性,通过ReceiveMessage()和ReceiveMessageAsync
()方法完成与服务器的连接、通讯和结束会话等功能,在调用了该方法后,我们就可以从邮件数目和邮件大小等属性中获得邮箱中的相关信息,进而运用该组件就可以轻松地开发岀诸如邮件信史之类的程序了。
同时,该组件中还包含了一个OnMailReceived()事件,该事件在完成了邮件的接收后被触发。
在组件的设计过程中,与主机的连接通讯是该组件的核心部分,所以我们不妨专门设计一个与主机的
连接类—Pop3Connection类,该类是主要运用了TcpClient类的对象,和主机建立基于TCP/IP网络协议的
连接。
在完成连接后,可以和主机进行通讯。
完成通讯后,则关闭与主机的连接。
在大致介绍了实现原理后,下面就是具体的实现方法了。
三•实现方法
首先,打开VS.net,新建一个VisualC#的项目在项目类型中选择"VisualC#项目",在模板中选择"类库",不妨将该项目命名为"Pop3Com"(这样,由该项目生成的组件的命名空间就为Pop3Com了),图示
如下:
1.Pop3Connection类:
这样,项目向导就完成了,接着我们将原来的Class1.cs改名为Pop3.cs,同时添加一个类Pop3Connection(文件名不妨为Pop3Connection.cs)。
如上所述,Pop3Connection类完成了与主机的连接、通讯和关闭连接等功能,所以我们必须调用.Net
框架中进行网络通讯的类库,在此我们运用的是TcpCIient类的对象作为网络连接的客户端。
同时,在与主
机的通讯过程中必然少不了对于输入输岀流的控制。
于是,我们在设计该类的时候,首先得添加如下命名空间:
usingSystem」0;
usingSystem.Net.Sockets;
Pop3Connection类的成员变量包括以下几个:
privateTcpClientsocket;
privateStreamReaderreader;
privateStreamWriterwriter;
privateboolconnected;
其中,bool类型的connected变量用于判断是否与主机取得了连接,它是该类的一个属性,对其操作如
下:
publicboolConnected
{
get{returnconnected;}}
Pop3Connection类的主要方法包含以下几个:
internalvoidOpen(stringhost,intport)
{
if(host==null||host.Trim().Length==0||port<=0)
{
thrownewSystem.ArgumentException("lnvalidArgumentfound.");
}
socket.Connect(host,port);
reader=newStreamReader(socket.GetStream(),System.Text.Encoding.ASCII);
writer=newStreamWriter(socket.GetStream(),System.Text.Encoding.ASCII);
connected=true;
}
internalvoidSendCommand(stringcmd)
{
writer.WriteLine(cmd);
writer.Flush();
}internalvoidGetReply(outstringreply,outintcode)
{
reply=reader.ReadLine();
code=reply==null?
-1:
lnt32.Parse(reply.Substring(0,3));}
internalvoidClose()
{
reader.Close();
writer.Flush();
writer.Close();
reader=null;
writer=null;
socket.Close();
connected=false;
Open()就是根据主机名和端口号取得
根据这些方法的名称,我们不难知道它们的作用。
第一个方法
和服务器的连接。
一旦连接成功,就通过TcpCIient类的对象获取网络通讯流并新建一个StreamReader对象
和一个StreamWriter对象。
不言而喻,这两个对象的作用是控制网络通讯的输出和输入。
最后,还要将connected的属性设置为true。
第二个方法SendCommand()就是在上面的StreamWriter类的对象writer的基础上往网络套接字中输入信息。
而第三个方法GetRepIy()则正好相反,它是用来从网络套接字中获取
信息的。
最后一个方法Close()的作用则是关闭输出、输入流的对象,然后调用TcpClient类的对象Close
()方法并将connected属性设置为false,从而关闭连接,结束会话。
2.Pop3类:
这样,我们就完成了Pop3Connection类的设计和编码工作,也就完成了整个组件最关键的部分。
接下来,我们就在该类的基础上设计Pop3类。
Pop3类包含了邮件通讯所必须的基本属性、方法和事件。
首先,我们来设计其中的属性。
该类应该包括主机名、端口号、用户名、密码、邮件数量、邮件总体积、邮件内容和状态信息等属性。
其中前四个属性是可读又可写的,后四个属性是只可读的。
具体的设置如下:
///
///主机名
///
publicstringHost
{
get{returnhost;}
set
{
if(value==null||value.Trim().Length==0)
{
thrownewArgumentException("lnvalidhostname.");
}
host=value;
}
}
///
///端口号
///
publicintPort
{
get{returnport;}
set
{
if(value<=0)
thrownewArgumentException("lnvalidport.");
}
port=value;
}
}
///
///用户名
///
publicstringUserName
{
get{returnusername;}
set
{
if(value==null||value.Trim().Length==0)
{
thrownewArgumentException("Invalidusername.");
}
username=value;
}
}
///
///密码
///
publicstringPassWord
{
get{returnpassword;}
set
{
if(value==null)
{
thrownewArgumentException("Invalidpassword.");
}
password=value;
///
III邮件数量
///
publicintNumOfMails
{
get{returnnumofmails;}
}
///
///邮件总体积
///
publicdoubleTotalSize
{
get{returntotalsize;}
}
///
///邮件内容
///
publicstringBody
{
get{returnbody;}
}
///
///状态信息
///
publicstringStatus
{
get{returnstatus;}
}
完成了该类的属性设计,我们接下来就完成该类的方法设计。
该类主要的方法就一个ReceiveMessage
(),顾名思义就是接收邮件信息的意思。
在这个方法中,我们运用了上面的Pop3Connection类的对象。
通过这个对象,我们就可以更加方便的进行网络通讯的操作。
不过,在具体介绍这个方法的实现以前,我先得向大家介绍一下邮件接收的基本原理。
其基本原理如下:
一开始便是客户端与服务器的连接。
不过,在客户端连接到服务器之前,注意把端口设为POP3协议
默认的110号。
客户端连接服务器成功后,服务器会返回以下信息:
+OK••…
字符+OK是POP3协议的返回信息。
它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有
两个:
+OK或者-ERR。
其中,+OK表示连接成功,而-ERR则表示连接失败。
接下来,客户端输入USER<用户名>
该命令告诉服务器你的用户名。
注意,有些服务器会区分大小写字母的。
服务器返回+OK后,客户端输入PASS<口令>
服务器返回+OK后,还返回一些邮箱的统计信息,比如:
+OK1message(s)[1304byte(s)]
不同的服务器返回的信息格式不太一样,所以我们可以用STAT命令来查看邮箱的情况。
STAT命令的回应
中有两个数字,分别表示邮件的数量和邮件的大小。
如果信箱里有信,就可以用RETR命令来获取邮件的正文。
RETR命令的格式为:
RETR<邮件编号>
如果返回结果第一行是+OK信息,则表示成功。
第二行起便是邮件的正文。
最后一行和SMTP协议一
样,是一个单独的英文句号,表示邮件的结尾部分。
把邮件存储起来后要用DELE命令删除邮箱中的邮件,否则原有的邮件会继续保留在服务器上,一旦邮件一多,你的邮箱就爆了。
DELE命令的格式为:
DELE<邮件编号>
如果删错了,可以用RSET命令来恢复所有已被删除的邮件。
条件是你还没有退出,一旦退出,那就一切ByeBye了。
全部完成以后,输入QUIT命令就可以退出POP3服务器了。
在了解了邮件接收的基本原理的基础上,我就向大家介绍ReceiveMessage()方法的具体实现:
///
///接收邮件信息
///