天天看點

從0實作聊天室5-增加資料庫功能

之前更新過從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

從0實作聊天室5-增加資料庫功能

用戶端啟動

選擇1 注冊,輸入使用者名密碼即可。

從0實作聊天室5-增加資料庫功能

輸入選項2,輸入剛才注冊的使用者名密碼,如果不一緻會提示錯誤

從0實作聊天室5-增加資料庫功能

登入成功:

從0實作聊天室5-增加資料庫功能

注冊并登入新的使用者111、222、333

從0實作聊天室5-增加資料庫功能

選擇選項3,即進入公聊,

使用者yikou向所有使用者說:hello!

從0實作聊天室5-增加資料庫功能

可見所有使用者均收到資訊。

使用者yikou向使用者111發送資訊:

從0實作聊天室5-增加資料庫功能

由下圖可知,隻有使用者111收到該資訊,其他使用者均沒有收到資訊。

從0實作聊天室5-增加資料庫功能
從0實作聊天室5-增加資料庫功能
從0實作聊天室5-增加資料庫功能

為友善讀者學習增加資料庫和去掉資料之間的差别,

用git維護版本。

從0實作聊天室5-增加資料庫功能

切換到沒有資料庫的版本,執行下面指令即可。

要切回有資料庫的版本執行下面的指令:

使用資料庫後,資料的存儲管理更加友善,資料類型更易于擴充,

邏輯關系也更加清晰。

從0實作聊天室5-增加資料庫功能

有需要的朋友抓緊下載下傳代碼運作下吧。

獲得完整代碼,關注公衆号:一口Linux,背景回複:chat

後面一口君,會在本項目基礎上再增加資料加密和檔案傳輸功能。

歡迎關注公衆号:一口Linux

繼續閱讀