之前更新過從0實作聊天室的4篇文章,很多粉絲朋友還是覺得内容相對簡單,本文一口君會在原有代碼基礎上增加資料庫操作功能,後續文章還會增加檔案傳輸功能。
前面文章連結:
《從0實作基于Linux socket聊天室-多線程伺服器模型-1》
《從0實作基于Linux socket聊天室-多線程伺服器一個很隐晦的錯誤-2》
《從0實作基于Linux socket聊天室-實作聊天室的登入、注冊功能-3》
《從0實作基于Linux socket聊天室-增加公聊、私聊-4》
本文需要增加資料庫功能,關于資料庫的基礎知識點,表的建立、增删改查等操作,以及對應的庫函數的使用請參考以下3篇文章:
《嵌入式資料庫sqlite3【基礎篇】-基本指令操作,小白一看就懂》
《嵌入式資料庫sqlite3【進階篇】-子句和函數的使用,小白一文入門》
《如何用C語言操作sqlite3,一文搞懂》
全部掌握後,開始進入本篇。
為了友善編譯,現在我們将前面文章的代碼結構做如下調整。
最終增加了資料的檔案目錄如下:
clean.sh 用于清除臨時檔案
gcc.sh 用于編譯整個工程
服務端代碼放置到chat_server目錄下;
用戶端代碼放置到chat_client目錄下;
資料庫相關代碼放在chat_server/data下。
chat.h是所有用戶端和伺服器都會用到的頭檔案,是以放置在根目錄下。
後續增加功能後,新增的頭檔案和C檔案分别添加到對應工程目錄的include和src目錄下即可。
我們之前維護的所有用戶端的資訊是用一個全局數組,并且沒有儲存功能,現在我們要把所有用戶端的資訊全部儲存到資料庫中。
資料庫存儲的目錄
資料庫名:
存儲使用者資訊的表名:
表user格式如下:
名稱
屬性
說明
name
TEXT PRIMARY KEY
使用者名,不能重複
passwd
TEXT NOT NULL
密碼
fd
INT NOT NULL
套接字描述符:-1表示不線上,>0表示線上
regist
使用者名是否注冊:-1沒有注冊,1注冊
資料庫操作最重要的就是語句,下面講解針對不同的功能對應的實作語句
用戶端發送注冊請求後,伺服器端注冊使用者資訊到資料庫中
資料庫操作語句如下:
功能函數如下:
用戶端發送登陸指令後,伺服器通過該函數判斷該使用者是否已經登陸成功
使用者發送注冊指令,伺服器需要判斷該使用者名是否已經被注冊過
使用者發送登陸指令,需要判斷使用者名密碼是否正确
使用者登陸成功後,或者發送下線申請,或者異常掉線,需要更新資料庫的狀态。
fd的值是套接字描述符,下線設定為-1,上線設定為對應的>0的值
使用者發送顯示線上使用者指令後,伺服器從資料庫當中查找所有線上使用者,并将姓名循環發送給用戶端
端口号設定為9999

用戶端啟動
選擇1 注冊,輸入使用者名密碼即可。
輸入選項2,輸入剛才注冊的使用者名密碼,如果不一緻會提示錯誤
登入成功:
注冊并登入新的使用者111、222、333
選擇選項3,即進入公聊,
使用者yikou向所有使用者說:hello!
可見所有使用者均收到資訊。
使用者yikou向使用者111發送資訊:
由下圖可知,隻有使用者111收到該資訊,其他使用者均沒有收到資訊。
為友善讀者學習增加資料庫和去掉資料之間的差别,
用git維護版本。
切換到沒有資料庫的版本,執行下面指令即可。
要切回有資料庫的版本執行下面的指令:
使用資料庫後,資料的存儲管理更加友善,資料類型更易于擴充,
邏輯關系也更加清晰。
有需要的朋友抓緊下載下傳代碼運作下吧。
獲得完整代碼,關注公衆号:一口Linux,背景回複:chat
後面一口君,會在本項目基礎上再增加資料加密和檔案傳輸功能。
歡迎關注公衆号:一口Linux