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

來源:互聯網
上載者:User
一。需求分析

     該區域網路簡易聊天系統主要分伺服器和用戶端兩個部分。用戶端交於使用者進行聊天,伺服器使用者管理所有使用者的資訊。     用戶端功能:          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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.