這是一個基於windows的,用C++編寫的客戶端服務器程序,適合初學者,高手誤入.
思路是這樣的.啟動服務器,服務器啟動後會創建一個子線程,用於向客戶端發送信息.用一個死循環用於接收客戶端的請求,客戶端請求成功後,會將客戶端的連接保存到一個集合中,下面會詳細介紹這個保存客戶端連接的類.客戶端連接成功後,服務器會創建一個子線程用於接收客戶端的信息,客戶端同樣也會創建一個子線程接收服務器的信息.這樣客戶端和服務器就能進行通訊,如果有哪一方退出,另一方對應的接收數據的線程就會自動終止.
退出一個客戶端後,服務器對應的接收數據的線程自動終止.如下圖:
服務器保存客戶端連接的集合中會刪除對應的客戶端連接,由於這個刪除操作是在子線程中發生的,也就是說會有多個線程操作這個集合,那麼針對這個集合的操作必須是線程安全的.保證線程安全的方法又很多,我的這篇博客《多線程編程--5種方法實現線程同步》介紹了5中方法實現線程同步,我這裡用的是關鍵段,還有一點值得說明的是,保存客戶端連接的集合肯定只能有一份,我用一個類封裝了這個集合,這個類中的每個方法都是線程安全的,且只能有一個實例,這裡用了比較暴力的方法,將相關的方法設為private,提供一個public的方法返回這個對象的一個靜態實例,唯一的一個實例。
保存客戶端連接的類如下:
_CLIENTLIST_H_<vector><assert.h> <CSocket*> Add(CSocket* Count() * Remove(CSocket** ClientList* &~ vector<CSocket*> ClientList&& =( ClientList&
#include <CSocket*>&g_cs); ~&g_cs); ClientList::Add(CSocket*(socket!=&g_cs); &g_cs); ClientList::Count() * ClientList::>= && index< ClientList::Remove(CSocket*=&g_cs); (iter!=*&g_cs); *&g_cs); Iter iter=(iter!=(*iter==++&g_cs); &g_cs); ( i=_list.size()-;i>=;i--&g_cs); <CSocket*> ClientList::_list ;
C++網絡編程(一)