八宝书库 > 文学其他电子书 > VC语言6.0程序设计从入门到精通 >

第68部分

VC语言6.0程序设计从入门到精通-第68部分

小说: VC语言6.0程序设计从入门到精通 字数: 每页4000字

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




息)。  



     #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     ;                          

                                                            更新服务器用户列表视图  

CClientSocket* pSocket)  

BOOL IsUsedName(CString sNickName)                          检查新登录的用户其用户名是否已被使用  

void CloseSocket(CClientSocket* pSocket)                    关闭连接  

void DeleteChatter(CMsg* pMsg)                              删除用户  

virtual void DeleteContents()                               当程序退出时做一些关闭、删除处理  



     下面为各函数编写代码。首先在构造函数中将各成员变量初始化,代码如下:  



    CChatServerDoc::CChatServerDoc()  



     {  



          // TODO: add one…time construction code here  



          m_pSocket = NULL;  



          m_msgList。RemoveAll();  



          m_connectionList。RemoveAll();  



          bIsNewChatter = TRUE;  



          m_ChattersList = 〃〃;  



     }  



    接着为“设定端口”菜单项添加响应函数,代码如下:  



    void CChatServerDoc::OnSetport()    



     {  



          // TODO: Add your mand handler code here  



          CPortDlg dlg;  



          if(dlg。DoModal() == IDOK)  



          {  



                //创建一个新的类进行监听  



                m_pSocket = new CListeningSocket(this);  



                if (m_pSocket…》Create(dlg。m_Port))  



                {  



                      if (m_pSocket…》Listen())  



                            return;  



                }  



          }  



     }  



                                                                                                             ·301 ·  


…………………………………………………………Page 313……………………………………………………………

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



      为函数 ProcessAccept()添加如下代码:  



      void CChatServerDoc::ProcessAccept()  



      {  



            //创建一个新的 Socket 来处理与客户端的数据交互  



            CClientSocket* pSocket = new CClientSocket(this);  



            //如果接受客户端的连接请求  



            if (m_pSocket…》Accept(*pSocket))  



            {  



                  //初始化  



                  pSocket…》Init();  



                  //将此连接 socket 加入连接链表中  



                  m_connectionList。AddTail(pSocket);  



            }       



            //如果不接受连接  



            else  



                  delete pSocket;  



      }  



      为函数 ProcessReceive()添加如下代码:  



      void CChatServerDoc::ProcessReceive(CClientSocket* pSocket)  



      {  



            CMsg* pMsg;    //接收的消息  



            CString sName;    //用户名  



            BOOL bIsUsedName = FALSE;    //用户名是否已使用  



            bIsNewChatter = FALSE;    //是否为新用户  



            do  



            {  



                  //接收消息  



                  pMsg = ReadMsg(pSocket);  



                  //如果此消息是发送的新的用户名(在用户登录时客户端先发此消息)  



                  if(pMsg…》code == SENDING_NICKNAME)  



                  {  



                         sName = pMsg…》m_strText;  



                         bIsNewChatter = TRUE;  



                         //检查此用户名是否已使用  



                         if(IsUsedName(sName))  



                               bIsUsedName = TRUE;  



                  }  



                  //如果连接已关闭则退出  



                  if (pMsg…》m_bClose)  



                  {  



 ·302 ·  


…………………………………………………………Page 314……………………………………………………………

                                                                                             第 11 章    网络编程  



             break;  



       }  



  }  



  while (!pSocket…》m_pArchiveIn…》IsBufferEmpty());  



  



  //如果是用户登录  



  if(bIsNewChatter)  



  {  



       //如果此用户名没有被使用  



       if(!bIsUsedName)  



       {  



             //发送消息通知各客户端  



             pMsg…》code = SENDING_CHATTERS_LIST;  



             m_ChattersList += sName + 〃:〃;  



             pMsg…》m_strText = m_ChattersList;  



             SendForNewer(pMsg);  



       }  



       //如果用户名已使用  



       else  



       {  



             //发消息通知此客户端  



             CMsg* msg = new CMsg;  



             msg…》Init();  



             msg…》code =    USED_NAME;  



             CString string;  



             string。Format(〃用户名已被使用!〃);  



             msg…》m_strText = string;  



             SendMsg(pSocket; msg);  



       }  



       bIsNewChatter = FALSE;  



       bIsUsedName = FALSE;  



  }  



  //如果消息表明该客户端已关闭连接  



  if (pMsg…》m_bClose)  



  {  



       //发送消息通知各客户端  



       SendToAllClients(NORMAL_MESSAGE);  



       //在视图中将该用户删除  



       DeleteChatter(pMsg);  



       //关闭连接  



                                                                                                           ·303 ·  


…………………………………………………………Page 315……………………………………………………………

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



                   CloseSocket(pSocket);  



                   //通知各客户端更新用户列表  



                   SendToAllClients(SENDING_CHATTERS_LIST);  



             }  



             //如果是普通消息,发送给各客户端  



             else  



                   SendToAllClients(NORMAL_MESSAGE);  



       }  



       为 ReadMsg() 函数编写如下代码:  



      CMsg* CChatServerDoc::ReadMsg(CClientSocket* pSocket)  



       {  



             static CMsg msg;  



             TRY  



             {  



                   //接收数据  



                   pSocket…》ReceiveMsg(&msg);  



                   //如果是新用户登录则更新用户列表  



                   if(msg。code == SENDING_NICKNAME)  



                   {  



                          UpdateChattersListView(msg。m_strText ; pSocket);  



                   }  



                   //如果是普通信息则更新聊天信息列表,并将信息加入到 m_msgList 链表中  



                   if(msg。code == NORMAL_MESSAGE)  



                   {  



                          UpdateMessageView(msg。m_strText);  



                          m_msgList。AddTail(msg。m_strText);  



                   }  



             }  



             CATCH(CFileException; e)  



             {  



                   CString strTemp;  



                   strTemp。Format(〃无法读取数据!〃);  



                   UpdateMessageView(strTemp);  



                   msg。m_bClose = TRUE;  



             }  



             END_CATCH  



             return &msg;  



       }  



       为 SendMsg()函数编写如下代码:  



      void CChatServerDoc::SendMsg(CClientSocket* pSocket; CMsg* pMsg)  



 ·304 ·  


…………………………………………………………Page 316……………………………………………………………

                                                                                                   第 11 章    网络编程  



{  



      TRY  



      {  



             //调用 CClientSocket 的函数发送消息  



             pSocket…》SendMsg(pMsg);  



      }  



      CATCH(CFileException; e)  



      {  



             CString strTemp;  



             strTemp。Format(〃无法发送数据!〃);  



             UpdateMessageView(strTemp);  



      }  



      END_CATCH  



}  



为函数 IsUsedName()编写如下代码:  



BOOL CChatServerDoc::IsUsedName(CString sNickName)  



{  



      CString tempStr; tempList; sName;  



      tempStr = 〃〃;  



      tempList = m_Chatter

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的