• 正文
    • 一. 調(diào)整目錄結(jié)構(gòu)
    • 二、 設(shè)計(jì)數(shù)據(jù)庫(kù)表
    • 三、 主要功能操作的語(yǔ)句及函數(shù)
    • 四、運(yùn)行結(jié)果
    • 五、代碼說(shuō)明
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

從0實(shí)現(xiàn)基于Linux socket聊天室-增加數(shù)據(jù)庫(kù)sqlite功能-5

02/01 15:17
426
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

之前更新過(guò)從0實(shí)現(xiàn)聊天室的4篇文章,很多粉絲朋友還是覺(jué)得內(nèi)容相對(duì)簡(jiǎn)單,本文一口君會(huì)在原有代碼基礎(chǔ)上增加數(shù)據(jù)庫(kù)操作功能,后續(xù)文章還會(huì)增加文件傳輸功能。

前面文章鏈接:

《從0實(shí)現(xiàn)基于Linux socket聊天室-多線程服務(wù)器模型-1》?

《從0實(shí)現(xiàn)基于Linux socket聊天室-多線程服務(wù)器一個(gè)很隱晦的錯(cuò)誤-2》?

《從0實(shí)現(xiàn)基于Linux socket聊天室-實(shí)現(xiàn)聊天室的登錄、注冊(cè)功能-3》?

《從0實(shí)現(xiàn)基于Linux socket聊天室-增加公聊、私聊-4》

本文需要增加數(shù)據(jù)庫(kù)功能,關(guān)于數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)點(diǎn),表的創(chuàng)建、增刪改查等操作,以及對(duì)應(yīng)的庫(kù)函數(shù)的使用請(qǐng)參考以下3篇文章:

《嵌入式數(shù)據(jù)庫(kù)sqlite3【基礎(chǔ)篇】-基本命令操作,小白一看就懂》

《嵌入式數(shù)據(jù)庫(kù)sqlite3【進(jìn)階篇】-子句和函數(shù)的使用,小白一文入門》

全部掌握后,開(kāi)始進(jìn)入本篇。

一. 調(diào)整目錄結(jié)構(gòu)

為了方便編譯,現(xiàn)在我們將前面文章的代碼結(jié)構(gòu)做如下調(diào)整。

root@ubuntu:/mnt/hgfs/code/chat#?tree?.
.
├──?chat_client
│???├──?include
│???├──?Makefile
│???├──?obj
│???│???└──?Makefile
│???└──?src
│???????├──?client.c
│???????└──?Makefile
├──?chat.h
├──?chat_server
│???├──?bin
│???│???└──?server
│???├──?data
│???├──?include
│???├──?Makefile
│???├──?obj
│???│???└──?server.o
│???└──?src
│???????├──?Makefile
│???????└──?server.c
└──?gcc.sh

10?directories,?15?files

最終增加了數(shù)據(jù)的文件目錄如下:

peng@ubuntu:/mnt/hgfs/code/chat-sqlite$?tree?.
.
├──?chat_client
│???├──?include
│???├──?Makefile
│???├──?obj
│???│???└──?Makefile
│???└──?src
│???????├──?client.c
│???????└──?Makefile
├──?chat.h
├──?chat_server
│???├──?data
│???├──?include
│???│???└──?data.h
│???├──?Makefile
│???├──?obj
│???│???└──?Makefile
│???└──?src
│???????├──?data.c
│???????├──?Makefile
│???????└──?server.c
├──?clean.sh
├──?gcc.sh
├──?user.db
└──?解壓密碼.txt

9?directories,?17?files

clean.sh 用于清除臨時(shí)文件gcc.sh 用于編譯整個(gè)工程

服務(wù)端代碼放置到chat_server目錄下;客戶端代碼放置到chat_client目錄下;

數(shù)據(jù)庫(kù)相關(guān)代碼放在chat_server/data下。

chat.h是所有客戶端和服務(wù)器都會(huì)用到的頭文件,所以放置在根目錄下。

后續(xù)增加功能后,新增的頭文件和C文件分別添加到對(duì)應(yīng)工程目錄的include和src目錄下即可。

二、 設(shè)計(jì)數(shù)據(jù)庫(kù)表

我們之前維護(hù)的所有客戶端的信息是用一個(gè)全局?jǐn)?shù)組,并且沒(méi)有保存功能,現(xiàn)在我們要把所有客戶端的信息全部保存到數(shù)據(jù)庫(kù)中。

數(shù)據(jù)庫(kù)存儲(chǔ)的目錄

chat_server/data

數(shù)據(jù)庫(kù)名:

user.db

存儲(chǔ)用戶信息的表名:

user

表user格式如下:

名稱 屬性 說(shuō)明
name TEXT PRIMARY KEY 用戶名,不能重復(fù)
passwd TEXT NOT NULL 密碼
fd INT NOT NULL 套接字描述符:-1表示不在線,>0表示在線
regist INT NOT NULL 用戶名是否注冊(cè):-1沒(méi)有注冊(cè),1注冊(cè)

三、 主要功能操作的語(yǔ)句及函數(shù)

數(shù)據(jù)庫(kù)操作最重要的就是語(yǔ)句,下面講解針對(duì)不同的功能對(duì)應(yīng)的實(shí)現(xiàn)語(yǔ)句

1 創(chuàng)建表user

CREATE?TABLE?IF?NOT?EXISTS?user(name?TEXT?PRIMARY?KEY??NOT?NULL,passwd?TEXT?NOT?NULL,fd?INT?NOT?NULL,regist?INT??NOT?NULL);

2 增加一個(gè)用戶

客戶端發(fā)送注冊(cè)請(qǐng)求后,服務(wù)器端注冊(cè)用戶信息到數(shù)據(jù)庫(kù)中

數(shù)據(jù)庫(kù)操作語(yǔ)句如下:

insert?into?user?values('一口Linux',?'123456',-1,?1)

功能函數(shù)如下:

int?db_add_user(char?name[],char?passwd[])
功能:
增加一個(gè)用戶,執(zhí)行該函數(shù)前需要先判斷該用戶名是否存在

參數(shù):
name:用戶名
passwd:密碼

返回值:
-1:失敗
1:成功

3 判斷用戶是否在線

客戶端發(fā)送登陸命令后,服務(wù)器通過(guò)該函數(shù)判斷該用戶是否已經(jīng)登陸成功

數(shù)據(jù)庫(kù)操作語(yǔ)句如下:

select?fd?from?user?where?name='一口Linux'

功能函數(shù)如下:

int?db_user_if_online(char?*name,char?*passwd)
功能:
判斷用戶是否在線,該函數(shù)主要根據(jù)fd的值來(lái)判斷用戶是否在線

參數(shù):
name:用戶名
passwd:密碼??

返回值:
1:在線
-1:不在線
-2:用戶不存在

4 判斷某個(gè)用戶名是否注冊(cè)

用戶發(fā)送注冊(cè)命令,服務(wù)器需要判斷該用戶名是否已經(jīng)被注冊(cè)過(guò)

數(shù)據(jù)庫(kù)操作語(yǔ)句如下:

select?regist?from?user?where?name='一口Linux'

功能函數(shù)如下:

int?db_user_if_reg(char?*name)
功能:
判斷某個(gè)用戶名是否注冊(cè)過(guò)

參數(shù):
name:用戶名

返回值:
?1:注冊(cè)過(guò)
-1:沒(méi)有注冊(cè)過(guò)

5 判斷用戶名密碼是否正確

用戶發(fā)送登陸命令,需要判斷用戶名密碼是否正確

數(shù)據(jù)庫(kù)操作語(yǔ)句如下:

select?*?from?user?where?name='一口Linux'?and?passwd='123456'

功能函數(shù)如下:

int?db_user_pwd_corrct(char?*name,char*?passwd)
功能:
判斷客戶端發(fā)送的用戶名密碼是否正確

參數(shù):
name:用戶名
passwd:密碼

返回值:
?1:正確
-1:用戶名或者密碼不正確

6 用戶上線、下線

用戶登陸成功后,或者發(fā)送下線申請(qǐng),或者異常掉線,需要更新數(shù)據(jù)庫(kù)的狀態(tài)。

數(shù)據(jù)庫(kù)操作語(yǔ)句如下:

UPDATE??user?set?fd=-1?where?name='一口Linux'

fd的值是套接字描述符,下線設(shè)置為-1,上線設(shè)置為對(duì)應(yīng)的>0的值

功能函數(shù)如下:

int?db_user_on_off(int?fd,char?*name,unsigned?int?on_off)?
功能:
更新數(shù)據(jù)庫(kù)中用戶的fd字段

參數(shù):
fd:套接字描述符
name:用戶名
on_off:上線還是下線

返回值:
?1:正確
-1:失敗

7. 顯示在線用戶

用戶發(fā)送顯示在線用戶命令后,服務(wù)器從數(shù)據(jù)庫(kù)當(dāng)中查找所有在線用戶,并將姓名循環(huán)發(fā)送給客戶端

int?db_list_online_user(int?fd)

四、運(yùn)行結(jié)果

編譯

./gcc.sh

1.服務(wù)器啟動(dòng)

./server?9999

端口號(hào)設(shè)定為9999

2. 客戶端注冊(cè)

客戶端啟動(dòng)

./client?127.0.0.1?9999

選擇1 ?注冊(cè),輸入用戶名密碼即可。

3. 用戶登錄

輸入選項(xiàng)2,輸入剛才注冊(cè)的用戶名密碼,如果不一致會(huì)提示錯(cuò)誤登錄成功:

4. 注冊(cè)登錄其他幾個(gè)用戶

注冊(cè)并登錄新的用戶111、222、333

5. 公聊

選擇選項(xiàng)3,即進(jìn)入公聊,
用戶yikou向所有用戶說(shuō):hello!可見(jiàn)所有用戶均收到信息。

6. 私聊

用戶yikou向用戶111發(fā)送信息:由下圖可知,只有用戶111收到該信息,其他用戶均沒(méi)有收到信息。

7. 顯示在線用戶

8. 查看最終數(shù)據(jù)庫(kù)信息

五、代碼說(shuō)明

為方便讀者學(xué)習(xí)增加數(shù)據(jù)庫(kù)和去掉數(shù)據(jù)之間的差別,

用git維護(hù)版本。

切換到?jīng)]有數(shù)據(jù)庫(kù)的版本,執(zhí)行下面命令即可。

git?reset?--hard??597330ae0a183c9db8f68b7c9f60df94f8965778

要切回有數(shù)據(jù)庫(kù)的版本執(zhí)行下面的命令:

git?reset?--hard?10bfbfaf2d09ae895313273c960ecfd84663f9fd

使用數(shù)據(jù)庫(kù)后,數(shù)據(jù)的存儲(chǔ)管理更加方便,數(shù)據(jù)類型更易于擴(kuò)充,
邏輯關(guān)系也更加清晰。

有需要的朋友抓緊下載代碼運(yùn)行下吧。

獲得完整代碼,關(guān)注公眾號(hào):一口Linux,后臺(tái)回復(fù):chat

后面一口君,還會(huì)在本項(xiàng)目基礎(chǔ)上再增加數(shù)據(jù)加密和文件傳輸功能。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

公眾號(hào)『一口Linux』號(hào)主彭老師,擁有15年嵌入式開(kāi)發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見(jiàn)教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動(dòng)、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動(dòng)新手入門和技術(shù)進(jìn)階。