基于Linux系统聊天室增加数据库sqlite功能实现(08)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

全部掌握后开始进入本篇。

一. 调整目录结构

为了方便编译现在我们将前面文章的代码结构做如下调整。

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

最终增加了数据的文件目录如下

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 用于清除临时文件gcc.sh 用于编译整个工程

服务端代码放置到chat_server目录下客户端代码放置到chat_client目录下

数据库相关代码放在chat_server/data下。

chat.h是所有客户端和服务器都会用到的头文件所以放置在根目录下。

后续增加功能后新增的头文件和C文件分别添加到对应工程目录的include和src目录下即可。

二、 设计数据库表

我们之前维护的所有客户端的信息是用一个全局数组并且没有保存功能现在我们要把所有客户端的信息全部保存到数据库中。

数据库存储的目录

chat_server/data

数据库名

user.db

存储用户信息的表名

user

表user格式如下

名称属性说明
nameTEXT PRIMARY KEY用户名不能重复
passwdTEXT NOT NULL密码
fdINT NOT NULL套接字描述符-1表示不在线>0表示在线
registINT NOT NULL用户名是否注册-1没有注册1注册

三、 主要功能操作的语句及函数

数据库操作最重要的就是语句下面讲解针对不同的功能对应的实现语句

1 创建表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 增加一个用户

客户端发送注册请求后服务器端注册用户信息到数据库中

数据库操作语句如下

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

功能函数如下

int db_add_user(char name[],char passwd[])
功能
增加一个用户执行该函数前需要先判断该用户名是否存在

参数
name用户名
passwd密码

返回值
-1失败
1成功

3 判断用户是否在线

客户端发送登陆命令后服务器通过该函数判断该用户是否已经登陆成功

数据库操作语句如下

select fd from user where name='嵌入式Linux'

功能函数如下

int db_user_if_online(char *name,char *passwd)
功能
判断用户是否在线该函数主要根据fd的值来判断用户是否在线

参数
name用户名
passwd密码  

返回值
1在线
-1不在线
-2用户不存在

4 判断某个用户名是否注册

用户发送注册命令服务器需要判断该用户名是否已经被注册过

数据库操作语句如下

select regist from user where name='嵌入式Linux'

功能函数如下

int db_user_if_reg(char *name)
功能
判断某个用户名是否注册过

参数
name用户名

返回值
 1注册过
-1没有注册过

5 判断用户名密码是否正确

用户发送登陆命令需要判断用户名密码是否正确

数据库操作语句如下

select * from user where name='嵌入式Linux' and passwd='123456'

功能函数如下

int db_user_pwd_corrct(char *name,char* passwd)
功能
判断客户端发送的用户名密码是否正确

参数
name用户名
passwd密码

返回值
 1正确
-1用户名或者密码不正确

6 用户上线、下线

用户登陆成功后或者发送下线申请或者异常掉线需要更新数据库的状态。

数据库操作语句如下

UPDATE  user set fd=-1 where name='嵌入式Linux'

fd的值是套接字描述符下线设置为-1上线设置为对应的>0的值

功能函数如下

int db_user_on_off(int fd,char *name,unsigned int on_off) 
功能
更新数据库中用户的fd字段

参数
fd套接字描述符
name用户名
on_off上线还是下线

返回值
 1正确
-1失败

7. 显示在线用户

用户发送显示在线用户命令后服务器从数据库当中查找所有在线用户并将姓名循环发送给客户端

int db_list_online_user(int fd)

四、运行结果

编译

./gcc.sh

1.服务器启动

./server 9999

端口号设定为9999

图片

2. 客户端注册

客户端启动

./client 127.0.0.1 9999

选择1  注册输入用户名密码即可。

图片

3. 用户登录

输入选项2输入刚才注册的用户名密码如果不一致会提示错误

图片

登录成功

图片

4. 注册登录其他几个用户

注册并登录新的用户111、222、333

图片

5. 公聊

选择选项3即进入公聊 用户yikou向所有用户说hello

图片

可见所有用户均收到信息。

6. 私聊

用户yikou向用户111发送信息 

由下图可知只有用户111收到该信息其他用户均没有收到信息。

图片

7. 显示在线用户

图片

8. 查看最终数据库信息

图片

五、代码说明

为方便读者学习增加数据库和去掉数据之间的差别

用git维护版本。

图片

切换到没有数据库的版本执行下面命令即可。

git reset --hard  597330ae0a183c9db8f68b7c9f60df94f8965778

要切回有数据库的版本执行下面的命令

git reset --hard 10bfbfaf2d09ae895313273c960ecfd84663f9fd

使用数据库后数据的存储管理更加方便数据类型更易于扩充 逻辑关系也更加清晰。

获得完整代码 直接访问https://gitee.com/wx_98fa5ee790/chat

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux数据库