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

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

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




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



      do  



      {  



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