多人暢聊系統

  這個聊天系統能夠達到羣聊的目的。當客戶端向服務器發送消息,服務器對這條消息進行轉發。因爲使用的是UDP協議,因此服務器會維護一張用戶列表,這個列表記錄了全部向服務器發送過消息的客戶地址。當某個客戶端退出時,會向服務器發送一條特殊的指令,而後服務器將該客戶地址從用戶列表上刪除。服務器

  

  從上圖能夠看出,服務器端使用生產者消費者模型,生產者從網絡中拿數據存到數據池,消費者從數據池中拿數據發送到網絡中,從而達到轉發的目的,而這個數據池,使用生產者消費者向數據池中寫數據和讀數據,所謂的數據池也就是一個環形隊列而已。網絡

  因爲使用的是UDP協議,因此服務器須要維護一張用戶列表,這個用戶列表能夠使用map,以用戶的IP做爲key,sockaddr_in做爲value.函數

  注意:輸入消息的時候咱們須要對消息進行序列化和反序列化。爲何要這樣作呢?咱們不能之直接將客戶端輸入的內容發送給服務器,由於用戶不少的話,最後就沒法分別消息是哪一個用戶發送的,爲此咱們能夠給每條消息都加上當前用戶的消息。因此客戶端給服務器發送的消息是由用戶的信息和輸入框中的消息拼接而成的。若是用戶退出的話,服務器要將該用戶從用戶列表刪除。爲此咱們能夠再客戶端給服務器發送的消息再拼接一個cmd字段,用來表示客戶端是否退出。blog

  當聊天結束時,客戶端退出。咱們能夠自定義一個信號處理函數,在信號處理函數中將cmd字段的值設置成非空,服務器拿到數據的時候,先反序列化解析出來cmd的值,判斷是否是退出的信息,若是是的話就將該用戶從用戶列表刪除。隊列

相關文章
相關標籤/搜索