局域網聊天系統__1.需求分析以及模型選擇

一。需求分析
     該局域網簡易聊天系統主要分服務器和客戶端兩個部分。客戶端交於用戶進行聊天,服務器用戶管理所有用戶的信息。
     客戶端功能:
          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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章