-8 主框架被分割为两部分
至此,界面部分已经完成。
(6)创建CListeningSocket 类
该类用户jiān tīng客户端的连接,创建方式与CChattersListView 类的创建方式相同,只是基
类选择CSocket。
在类的定义中声明宏DECLARE_DYNAMIC(CListeningSocket),该宏的作用是可以在运
枫叶文学网www.fywxw.com
第11 章 网络编程
·297·
行时获得类的信息。相应的,如果在类定义中声明了此宏,则在类实现时需要声明宏
IMPLEMENT_DYNAMIC(CListeningSocket, CSocket)。
为该类增加成员变量CChatServerDoc* m_pDoc,这是因为本程序采用文档-视图结构,
所有关于数据的cāo作都可以通过文档类进行,m_pDoc 就是文档类的一个指针。这里用到了
CChatServerDoc 类, 因此在CListeningSocket 类定义的外部, 要加上语句class
CChatServerDoc,在文件“ListeningSocket.cpp”中,要加入语句#include "ChatServerDoc.h"。
为CListeningSocket 类新增加一个构造函数CListeningSocket(CChatServerDoc* pDoc),
代码如下:
CListeningSocket::CListeningSocket(CChatServerDoc* pDoc)
{
m_pDoc = pDoc;
}
最后要重载CSocket 类的OnAccept()函数,代码如下:
void CListeningSocket::OnAccept(int nErrorCode)
{
//调用CScoekt 的OnAccept 函数
CSocket::OnAccept(nErrorCode);
//其余工作jiāo给文档类处理
m_pDoc->ProcessAccept();
}
可以看出,CListeningSocket 类的工作就是接收客户端连接,然后具体的数据传输工作jiāo
给CChatServerDoc 类来处理。这里的ProcessAccept()函数是CChatServerDoc 类的一个成员函
数。在后面的CChatServerDoc 类成员函数的实现中,读者可以看到此函数的具体实现过程。
(7)创建CClientSocket 类
当服务器jiān tīng到一个连接并接收后,会生成一个新的CSocket 对象来处理服务器和客户
端的数据传输。在本程序中,将这新生成的CSocket 封装成CClientSocket 类。创建该类的过
程和创建CListeningSocket 类完全一样。
同样的,在类的定义中声明宏DECLARE_DYNAMIC(CClientSocket),在类的实现中声
明宏IMPLEMENT_DYNAM