1. 程式人生 > >基於epoll實現的c++聊天室(全程式碼)

基於epoll實現的c++聊天室(全程式碼)

早些時候為了更加熟悉網路程式設計,所以寫了一個聊天程式練練手,但那是純linux終端實現的,沒有介面,最近心血來潮翻出來加了個Qt的簡單介面,成了一個簡易的區域網聊天室,通過tcp伺服器來轉發訊息,其實最初實現的時候無介面情況下已經實現了單聊群聊檔案傳輸,udp檔案傳輸還實現了補包重傳(udp雖然不可靠傳輸但是比tcp牛逼),有興趣的同學可以一起來學習和交流。如果有時間的話我會拓展一下其他的功能,包括檔案,表情什麼的,學習微信讓他慢慢的完善,目前已經上傳github,地址在下方。

伺服器環境:

ubuntu Qt cmake編譯

客戶端環境:

windows Qt cmake編譯

github地址:

git分支說明:

master分支是我之前的純終端實現的,客戶端和伺服器都在linux上實現,裡面包含客戶端和服務端的程式碼

develop-client是Qt介面的最新版客戶端程式碼(僅客戶端),和下面截圖吻合的程式碼

develop-server是最新版伺服器程式碼(僅伺服器)

下面是截圖:

登入介面
聊天介面

聊聊大體框架:

說實話一下子說完所有的程式碼其實是不可能的,所以我只是給出了原始碼的路徑,大家有興趣的可以去下載,我這邊先聊一下整個專案的整體框架,日後再慢慢大家聊具體程式碼。

客戶端:

客戶端其實很簡單,檔案列表如下:

mainwindow:實現了登入視窗的功能

cchatgui:實現了聊天視窗的功能

io:實現了和伺服器資料互動的功能

savelist:實現了一個加鎖的安全佇列,進行資料快取和傳輸

user:裡面存放了當前使用者的基本資料

服務端:

服務端程式碼可能會稍微複雜點,這邊就不一一羅列了,但是總的來說說其實就是三層架構,三個大類互不影響,三個執行緒同時開啟,其實一個很重要的地方就是安全佇列,比如兩個模組共享一個佇列,當一個模組往佇列裡面扔東西的時候,第二個模組在不停的檢測,一旦檢測到有資料,就會處理這些資料,實現資料的互通。

1、監聽層(控制使用者登陸)

監聽層通過epoll監聽有沒有客戶端connect,若有則通過安全佇列將資料傳輸到指令層

2、指令層(伺服器的大腦,判斷是什麼包需要做什麼處理)

收到相應的包以後作出相應的處理,通過安全佇列傳輸到io層

3、io層(epoll核心,控制資料收發)

不管三七二十一,收到客戶端的包就交給指令層處理,收到指令層的包就轉發給相應的客戶端