友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第84章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




明宏 IMPLEMENT_DYNAMIC(CClientSocket; CSocket) 。  

     为该类加入成员变量,如表 11…7 所示。  



     表 11…7                      CClientSocket 类成员变量及其说明  



              成员变量                                               说明  

 CChatServerDoc* m_pDoc               关联的文档类,很多数据处理工作在文档类中完成  

 CSocketFile* m_pFile                 CArchive 与 CSocket 的联系桥梁,通过它来创建 CArchive 类  

 CArchive* m_pArchiveIn               用于数据接收  

 CArchive* m_pArchiveOut              用于数据发送  

 int m_nMsgCount                      信息的数目  



     为该类加入成员函数,如表 11…8 所示。  

       

       



                                                                                          ·297 ·  


…………………………………………………………Page 309……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



      表 11…8                             CClientSocket 类成员函数及其说明  



                         成员函数                                                            说明  

  CClientSocket(CChatServerDoc* m_pDoc)                       构造函数  

  void Init()                                                 对成员变量进行初始化  

  void SendMsg(CMsg* pMsg)                                     发送消息  

  void ReceiveMsg(CMsg* pMsg)                                 接收消息  

  virtual void OnReceive(int nErrorCode)                      重载 CSocket 的 OnReceive()函数  



      在创建的过程中用到了类 CMsg 和类 CChatServerDoc,因此在文件“ClientSocket。h ”的 

开始声明两个类。  



      class CMsg;  



      class CChatServerDoc;  



      在“ClientSocket。cpp ”文件的开始要把两个头文件包含进来。代码如下:  



      #include 〃msg。h〃  



      #include 〃ChatServerDoc。h〃  



      最后为各函数编写代码。构造函数代码如下:  



      CClientSocket::CClientSocket(CChatServerDoc* pDoc)  



      {  



            m_pDoc = pDoc;  



            m_nMsgCount = 0;  



            m_pFile = NULL;  



            m_pArchiveIn = NULL;  



            m_pArchiveOut = NULL;  



        



      }  



      析构函数代码如下:  



      CClientSocket::~CClientSocket()  



      {  



            if (m_pArchiveOut != NULL)  



                  delete m_pArchiveOut;  



        



            if (m_pArchiveIn != NULL)  



                  delete m_pArchiveIn;  



        



            if (m_pFile != NULL)  



                  delete m_pFile;  



      }  



      初始化函数 Init()代码如下:  



      void CClientSocket::Init()  



      {  



            m_pFile = new CSocketFile(this);  



            m_pArchiveIn = new CArchive(m_pFile;CArchive::load);  



 ·298 ·  


…………………………………………………………Page 310……………………………………………………………

                                                                                                第 11 章    网络编程  



            m_pArchiveOut = new CArchive(m_pFile;CArchive::store);  



      }  



      发送信息函数 SendMsg()代码如下:  



      void CClientSocket::SendMsg(CMsg* pMsg)  



      {  



            if (m_pArchiveOut != NULL)  



            {  



                  //数据由 pMsg 输出到 m_pArchiveOut  



                  pMsg…》Serialize(*m_pArchiveOut);  



                  //将数据写入文件  



                  m_pArchiveOut…》Flush();  



            }  



      }  



      接收信息函数 ReceiveMsg()代码如下:  



      void CClientSocket::ReceiveMsg(CMsg* pMsg)  



      {  



            //数据由 m_pArchiveIn 读入到 pMsg  



            pMsg…》Serialize(*m_pArchiveIn);  



      }  



      重载的 OnReceive()函数代码如下:  



      void CClientSocket::OnReceive(int nErrorCode)  



      {  



            //调用 CSocekt 的 OnReceive 函数  



            CSocket::OnReceive(nErrorCode);  



       



            //其余工作交给文档类处理  



            m_pDoc…》ProcessReceive(this);  



      }  



      其中,ProcessReceive() 函数是 CChatServerDoc 类的一个成员函数,在后面将会看到它的 

具体实现。  



      (8)创建设定端口对话框  

      对服务器来说,它可以通过“设定端口号”对话框来设定服务端口,如图 11…9 所示。其 

中,对话框的 ID 为 IDD_SETUPDLG ,Edit 控件的 ID 为 IDC_PORT 。  



                                                                           



                                         图 11…9     “设定端口号”对话框  



                                                                                                             ·299 ·  


…………………………………………………………Page 311……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     打开“ClassWizard ”对话框,为此对话框创建一个类,取名为  CPortDlg 。然后为  Edit 

控件增加变量 int m_Port ,在构造函数中将其初始化为 2000 。  

     最后,在菜单栏中新建一菜单项,当单击此菜单项时,就会弹出如图  11…10 所示的对话 

框。  



                                                                    



                                  图 11…10    对话框所对应菜单栏  



     此菜单项的 ID 为 ID_SETPORT 。  



     (9 )实现 CChatServerDoc 类  

     大量的工作都是在              CChatServerDoc    类中实现的。在开始编写代码前,首先在文件 

“ 

 ChatServerDoc。h ”中 CChatServerDoc 类定义的前面加入如下的类声明语句:  



     class CListeningSocket;  



     class CClientSocket;  



     class CMsg;  



     在文件“ChatServerDoc。cpp ”的开头加入如下的 include 语句:  



     #include 〃MainFrm。h〃  



     #include〃PortDlg。h〃  



     #include 〃ChattersListView。h〃  



     #include 〃ChatView。h〃  



     #include 〃ListeningSocket。h〃  



     #include 〃ClientSocket。h〃  



     #include 〃Msg。h〃  



     在文件“ChatServerDoc。cpp ”的开头加入下面的定义语句(它定义了 5 种不同类型的消 

息)。  



     #define LEAVING_CHAT 1  



     #define SENDING_CHATTERS_LIST 2  



     #define SENDING_NICKNAME 3  



     #define NORMAL_MESSAGE 4  



     #define USED_NAME 5  



     这 5 种类型消息的具体含义在下面的程序中会详细说明。  

     接下来,为 CChatServerDoc 类添加一些成员变量,如表 11…9 所示。  



     表 11…9                     CChatServerDoc 类成员变量及其说明  



                    成员变量                                              说明  

 CListeningSocket* m_pSocket                      监听客户连接  

 CStringList m_msgList                            存放所有聊天信息的链表  

 CPtrList m_connectionList                        存放所有客户端连接的链表  

 BOOL bIsNewChatter                               表示新加入的用户其用户名是否已有人使用  

 CString m_ChattersList                           保存当前正在连接的所有用户名  



     为 CChatServerDoc 类添加成员函数,如表 11…10 所示。  



 ·300 ·  


…………………………………………………………Page 312……………………………………………………………

                                                                                                第 11 章    网络编程  



     表 11…10                          CChatServerDoc 类成员函数及其说明  



                       成员函数                                                          说明  

void ProcessAccept()                                        当监听到客户端连接时调用此函数进行处理  

void ProcessReceive(CClientSocket* pSocket)                 当接收到信息时调用此函数,进行信息接收等操作  

CMsg* ReadMsg(CClientSocket* pSocket)                       接收信息  

void SendMsg(CClientSocket* pSocket; CMsg* pMsg)            发送信息  

void SendToAllClients(int nCode)                            给各客户端发送消息  

CMsg*     AssembleMsg(CClientSocket*       pSocket;   int   封装消息,nCode 指定消息类型  

nCode)  

void SendForNewer(CMsg* pMsg)                            给各客户端发送消息,告知有新用户加入  

void UpdateMessageView(LPCTSTR lpszMessage)                 更新服务器聊天信息视图  

void    UpdateChattersListView(CString        sName     ;  
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!