科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Managed C++设计新邮件检查器

Managed C++设计新邮件检查器

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Managed C++是微软Visual Studio.Net的一部分,它是从标准C++发展而来的,所以和标准C++几乎是一样的

作者:王凯明 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
到此,程序的主界面的类已经完成,接下来我们就开始设计我们的核心类-CPOP3Client类。我们为该类设计了一些必要的方法和属性,其中方法包括连接服务器的方法-ConnectToServer(),向服务器发送命令的方法-SendCommand()和断开与服务器连接的方法-DisconnectFromServer()。各个方法的功能是显而易见的,这里就不赘述。下面给出各个方法的具体实现方法:

//**********************************************************
// 连接到POP3服务器
file://
// 返回值:成功为true,失败为false
file://**********************************************************
bool ConnectToServer()
{
 String *strReadBuffer;
 StreamReader *streamRead;

 // 关闭已存在的连接
 Close();

 // 和服务器建立一个连接
 m_Client = new TcpClient(m_strPOP3HostName, 110);

 // 创建一个读取流
 streamRead = new StreamReader(m_Client->GetStream(), Encoding::ASCII );

 strReadBuffer = streamRead->ReadLine();

 // 忽略buffer中的多余部分
 streamRead->DiscardBufferedData();

 // 回复是否以+OK开头,是则成功,否则失败.
 if(strReadBuffer->StartsWith("+OK"))
  return true;
 else
 {
  Close();
  return false;
 }
}

  该方法首先创建一个TcpClient类的对象,根据这个对象获取一个网络读取流,通过这个流,我们就可以和服务器实现通讯。根据从服务器读取的信息,我们决定是否已成功的和服务器取得连接,即若服务器返回的信息以"+OK"开头则表示成功,否则则是失败了。

//**********************************************************
// 将命令发送到服务器,并从服务器获得相应的回复
file://
// 参数:strCommand - 发送到服务器的命令,pstrOutput - 从服务器获得的回复
file://
// 返回值:成功为true,失败为false
file://**********************************************************
bool SendCommand(String *strCommand, String** pstrOutput)
{
 Byte outbuffer __gc[];

 StreamReader *streamRead;
 NetworkStream *streamWrite;
 String *strRequest;

 if (m_Client == NULL)
  return false;

 // 给每个命令添加结束符
 strRequest = String::Concat(strCommand, S"\r\n");

 // 创建一个从套接字读写数据的流
 streamWrite = m_Client->GetStream();
 streamRead = new StreamReader(streamWrite, Encoding::ASCII);

 // 将字符串转化为字节流并将它写入套接字中
 outbuffer = Encoding::ASCII->GetBytes(strRequest);
 streamWrite->Write(outbuffer, 0, outbuffer->Length);

 // 从套接字读取回复
 *pstrOutput = streamRead->ReadLine();

 // 忽略buffer中的多余部分
 streamRead->DiscardBufferedData();

 return (*pstrOutput)->StartsWith(S"+OK") ? true : false;
}

  该方法中我们首先获取网络读写流,根据该流和服务器进行通讯:首先将字符串转化为字节流并将它写入套接字中,然后读取服务器的回复,如果返回信息以"+OK"开头,该方法则返回true,否则则返回false。

//**********************************************************
// 断开与POP3服务器的连接
file://**********************************************************
void DisconnectFromServer()
{
 String *strResponse = String::Empty;

 SendCommand("QUIT", &strResponse);

 Close();
}

  该方法向服务器发送QUIT命令表示和服务器断开连接。以上的方法大量运用了.Net网络编程和输入输出流操作的方法,所以要用到有关网络编程和输入输出流的名字空间,因此务必不要忘了在文件开始处添加如下一些语句:

using namespace System::Net::Sockets;
using namespace System::IO;
using namespace System::Text;

  到此,我们设计好了该类的基本方法,剩下的就是完成对各项属性的设计了。在一个邮件客户端程序中,我想以下一些属性是必须的:服务器地址,端口号(此处已预设为110,所以不必考虑),用户名,密码,状态和新邮件数目。其中状态和新邮件数目都是从服务器获得的信息,所以只能是只读的。以下就是对这些属性的设计:

// POP3服务器地址
__property String* get_POP3HostName()
{
return m_strPOP3HostName;
}

__property void set_POP3HostName(String* strPOP3HostName)
{
m_strPOP3HostName = strPOP3HostName;
}

// 用户名
__property String* get_UserName()
{
return m_strUserName;
}

__property void set_UserName(String *strUserName)
{
m_strUserName = strUserName;
}

// 密码
__property String* get_Password()
{
return m_strPassword;
}

__property void set_Password(String *strPassword)
{
m_strPassword = strPassword;
}

// 状态
__property String* get_Status()
{
return m_strStatus;
}

// 新邮件数目
__property int get_NumberOfMessages()
{
String *strResponse = String::Empty;
String *strNrOfMessages;

Char separator __gc[] = new Char __gc[1];
separator[0] = ' ';

try
{
if(!ConnectToServer())
return -1;

if(!SendCommand(String::Concat(S"USER ", m_strUserName),
&strResponse))
{
return -1;
}


if(!SendCommand(String::Concat(S"PASS ", m_strPassword),
&strResponse))
{
return -1;
}

if(!SendCommand(S"STAT", &strResponse))
{
return -1;
}


// 从回复信息中获得新邮件的数目
strNrOfMessages = strResponse->Split(separator)[1];

return Convert::ToInt32(strNrOfMessages);
}
catch(Exception* e)
{
m_strStatus = String::Concat(S"Error: ", e->Message);
return -1;
}
__finally
{
DisconnectFromServer();
}
}


  所有的属性中新邮件数目属性是最重要的一个,它调用了本类的各个方法,完成了连接服务器,向服务器发送各种命令并取得有关新邮件数目的信息,最后断开与服务器的连接。同时还处理了一些异常情况。这样,在程序的主界面类中我们只要读取该类的对象的新邮件数目属性就可以获取邮箱中的新邮件数目,而不必去考虑如何实现服务器的连接、通讯和断开连接等操作了,这正体现出了面向对象设计的优势所在。

  这样我们就完成了整个程序的设计和编码工作,接下来让我们测试一下自己的成果吧。运行程序如下:


  在设置好相关参数后,点击"Check Mail!"按钮,不久程序就会弹出一个MessageBox来向用户报告其邮箱中的新邮件数目,图示如下:


  四.全文小结:

  本文向读者介绍了如何运用Managed C++创建一个新邮件检查器,其中大量运用了Windows Forms编程和.Net框架下的网络编程的原理。通过本文,希望能使读者对.Net中的Managed C++有一个感性的认识,同时对Windows Forms编程和其中的网络编程也有个大致的了解。最后,希望各位能尽快掌握.Net中的各种新技术并付诸于实践应用中。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章