前面文章鏈接如下:
《從0實現基於Linux socket聊天室-多線程服務器模型-1》
《從0實現基於Linux socket聊天室-多線程服務器一個很隱晦的錯誤-2》
《從0實現基於Linux socket聊天室-實現聊天室的登錄、注冊功能-3》
上文中,我們基於多線程的框架,實現了注冊和登錄的功能,這一章,我們在此基礎上來實現公聊、私聊、顯示在線用戶列表功能。
公聊
接着上幾篇的流程圖我們詳細講解公聊流程圖如下:
如上圖所示,我們去掉了網絡連接和客戶端登錄、注冊等功能,直接進入聊天的流程:
- 客戶端從菜單選擇公聊功能;
- 輸入要聊天信息;
- 回車發送聊天信息;
- 服務器的子線程收到公聊數據之后,進入公聊流程;
- 查找所有在線用戶,向所有的在線用戶發送該公聊信息;
- 客戶端進入聊天后會創建一個子線程,該子線程會循環接收所有服務器發送的數據信息。
私聊
如上圖所示:
- 客戶端從菜單選擇私聊功能;
- 輸入要聊天的對象和聊天信息;
- 發送聊天信息給服務器;
- 服務器的子線程收到公聊數據之后,進入公聊流程;
- 查找所有在線用戶,向所有的在線用戶發送該公聊信息;
- 客戶端子線程會循環接收所有服務器發送的數據信息。
顯示在線用戶
如上圖所示:
- 客戶端從菜單選擇顯示在線用戶功能;
- 封裝顯示在線用戶數據包,並發送該數據包給服務器;
- 服務器收到數據包后,進入顯示在線用戶功能模塊;
- 檢查在線用戶數據信息數據庫,將在線用戶【fd不為-1】名稱封裝到數據包中,一次只填充一個,stat字段填充ONLINEUSER_OK;
- 所有用戶發送完畢,補充一個數據包,stat填充ONLINEUSER_OVER;
- 收到服務器發送的在線用戶數據包后,客戶端子線程進入顯示在線用戶子模塊;提取數據包中在線用戶名字並打印,判斷該數據包stat是否為 ONLINEUSER_OVER,如果不是則繼續接收下一個數據包,如果是,則提示用戶顯示完畢。
運行截圖
現在預設:
客戶A:yikoulinux
客戶B:yikoupeng
公聊
客戶B發公聊:
客戶A收到信息:
服務器log:
私聊
客戶B私發信息給A:
客戶A收到的消息:
顯示在線用戶信息
完整版代碼
請自行下載:
請自行下載:
鏈接:https://pan.baidu.com/s/1tVqJ59AUTkGBxuBBAVCsEQ
提取碼:81v3
更多linux相關知識,請關注公眾號 一口Linux 。