局域网聊天系统__1.需求分析以及模型选择

来源:互联网 发布:哪个淘宝搜词软件好 编辑:程序博客网 时间:2024/06/10 02:54
一。需求分析
     该局域网简易聊天系统主要分服务器和客户端两个部分。客户端交于用户进行聊天,服务器用户管理所有用户的信息。
     客户端功能:
          1.和其他在线用户进行正常聊天
          2.更新用户状态:当有用户上线或下线时,及时更新该用户状态
          3.更新用户列表:当其他用户新上线获得被服务器删除时,及时更新用户列表
          4.发送离线消息:用户能向其他不在线的用户发送离线消息
          5.接收离线消息:用户在上线时,能够收到其他用户发来的离线消息
          6.持久化聊天记录:将用户聊天记录保存到文件 下次启动聊天自动加载
         
     服务器功能:
          1.查看当前用户列表:能够查看用户详细信息 包括IP 密码 上下线时间等
          2.维护当前用户列表:能够删除离线用户以及强制某在线用户下线
          3.验证用户登录:    当用户登录时,进行必要的验证(密码验证,重复登录验证等)
          4.保存离线消息:    替离线用户保存由在线用户发来的离线消息
          5.转发离线消息:    当离线用户上线时,转发为其保存的离线消息
          6.通知客户端更新成员列表:当有新用户注册或者被删除时,通知客户端更新列表
          7.通知客户端更新成员状态:当有用户上下线时,通知所有客户端更新该用户状态
          8.持久化必要数据:在服务器退出时,保存当前暂存的离线消息和用户列表 下次启动自动加载

二. 界面预览
服务器
客户端界面
登录界面 用户界面 离线消息
聊天界面
在线聊天 离线聊天

其他界面

三。通信模型选择
      这里选择WSAAsyncSelect模型,通过CSocket类完成客户端和服务器以及客户端和客户端之间的通信
      关于CSocket的实现原理这里就不再累述了。对于使用者实际使用来说,CSocket基本特点简要如下:
      1.根据功能作用(监听套接字,通信套接字),派生CSocket得到自己想要的类
      2.根据该CSocket派生类所感兴趣的消息覆盖CSocket对应的虚函数(如OnAccept OnReceive OnSend OnClose等)
      3.在对应的覆盖函数中,做出对应操作
          这里有必要说一下CSocketFile类,该类通过序列化操作使得基于CSocket的通信变得异常简便。本实例也通过CSocketFile完成通信。每一个CSocket类或其派生类都应该有一个CSocketFile与其相关联来完成序列化通信。为一个CSocket类关联一个CSocketFile对象可通过在构造CSocketFile对象时传入该CSocket类的指针来实现 比如在CSocket类构造后调用 m_pSocketFile = new CSocketFile(this);
          在关联了CSocketFile对象并且保存了其指针后,之后可以通过以下方式实现发送数据
     CArchive* pArchiveOut = new CArchive(m_pSocketFile, CArchive::store);

     //发送消息
     chatpacket.Serialize(*pArchiveOut);
     pArchiveOut->Flush();

     delete pArchiveOut;
     pArchiveOut = NULL;
     
     chatpacket即为通信包 该包需要是一个能够实现序列化的类。通过序列化操作将数据写入m_pSocketFile指向的文件流,而该文件流关联于CSocket类,从而将数据写到了对应的发送缓冲区。同理接收文件也简化为:
     CArchive* pArchiveIn = new CArchive(m_pSocketFile, CArchive::load);
     
     //写入数据到文件流
     chatpacket.Serialize(*pArchiveIn);

     delete pArchiveOut;
     pArchiveOut = NULL;
       
     对于OnAccept,在接受连接请求时,其参数需要一个CSocket类对象:
     CClientSocket* pClient = new CClientSocket();

     //调用监听套接字接受连接请求 并关联到客户端对象
     SOCKADDR_IN clientAddr;
     int len = sizeof(SOCKADDR_IN);
     m_pListenSocket->Accept(*pClient, (SOCKADDR*)&clientAddr, &len);

     在发送和接收数据时,需要注意:



 这些只是初步使用CSocket机制的必要知识,如果要将其用到多线程或者更复杂的环境,将会面临种种难点,这些都需要我们更加深入地理解CSocket的内部实现,结合Win32 Socket编程知识,在理解上加深巩固。咳,当然,我肯定是还不会这些的。-.-
源代码下载地址点击这里:http://download.csdn.net/detail/wudaijun/4911762

原创粉丝点击