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