之前更新了4篇从零开始实现聊天室的文章,很多爱好者还是觉得内容比较简单,将在此基础上添加这篇文章原代码的数据库操作功能,后续文章还会增加文件传输功能。本文需要添加数据库功能。数据库的基础知识点,建表、增删改查、查询等操作,以及相应库函数的使用,请参考以下三篇文章:《嵌入式数据库sqlite3【基础篇】-基本命令操作,小白一看就懂》《嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门》《如何用C语言操作sqlite3,一文搞懂》开始进入本文。1.调整目录结构为了编译方便,我们现在将上一篇文章的代码结构调整如下。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.sh10个目录,15个文件最后添加数据的文件目录如下: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└──解压password.txt9目录,17filesclean.sh用于清除临时文件文件gcc.sh编译整个项目服务器代码并将其放在chat_server目录中;chat_client目录中的客户端代码;chat_server/data中的数据库相关代码。chat.h是所有客户端和服务器都要用到的头文件,所以放在根目录下。后面添加函数后,可以将新添加的头文件和C文件分别添加到对应工程目录的include和src目录下。2.设计数据库表。我们之前用一个全局数组来维护所有的客户信息,没有保存功能。现在我们需要将所有客户信息保存在数据库中。数据库存放目录chat_server/data数据库名:user.db存放用户信息的表名:usertableuser格式如下:3.main函数操作的语句和函数数据库操作中最重要的就是语句。下面解释不同函数的对应关系实现语句1.建表userCREATETABLEIFNOTEXISTSuser(nameTEXTPRIMARYKEYNOTNULL,passwdTEXTNOTNULL,fdINTNOTNULL,registINTNOTNULL);2.添加用户客户端发送注册请求后,服务器将用户信息注册到数据库中。数据库操作语句如下:'123456',-1,1)函数如下:intdb_add_user(charname[],charpasswd[])功能:添加一个用户,在执行该函数之前,需要判断是否是用户名存在。参数:name:用户名passwd:密码返回值:-1:失败1:成功3.判断用户是否在线客户端发送登录命令后,服务端通过该函数判断用户是否登录成功。数据库操作语句如下:selectfdfromuserwherename='Linux的一个端口'函数功能如下:intdb_user_if_online(char*name,char*passwd)功能:判断用户是否在线,该函数主要判断用户是否在线根据fd的值判断是否在线参数:name:用户名passwd:密码返回值:1:在线-1:不在线-2:用户不存在4.判断用户名是否注册。用户发送注册命令,服务器需要判断用户名是否已经注册。功能:判断用户名是否已经注册。参数:name:用户名返回值:1:已注册-1:未注册5、判断用户名和密码是否正确。用户发送登录命令,需要判断用户名和密码是否正确。数据库操作语句如下:select*fromuserwherename='andpasswd='123456'函数如下:intdb_user_pwd_corrct(char*name,char*passwd)功能:判断是否发送了用户名和密码由客户是正确参数:name:用户名passwd:密码返回值:1:正确-1:用户名或密码不正确6、用户登录成功后,或发送下线申请,或异常下线,需要更新状态数据库的数据库操作语句如下:UPDATEusersetfd=-1wherename='一口Linux'fd的值为socket描述符,离线设置为-1,在线设置为对应的>0值。函数功能如下:intdb_user_on_off(intfd,char*name,unsignedinton_off)功能:更新数据库中用户的fd字段用户发送显示在线用户的命令后,服务器从数据库中搜索所有在线用户,并将名称发送给客户端intdb_list_online_user(intfd)4.编译运行结果./gcc.sh1。启动服务器。99992.客户端注册Clientstartup./client127.0.0.19999选择1注册,输入用户名和密码即可。3、用户登录输入选项2,输入刚刚注册的用户名和密码,如果不一致,会提示错误登录成功:4、注册并登录其他几个用户注册并登录新用户111、222、3335。publicchat选择选项3,即进入publicchat,用户yikou对所有用户说:你好!可以看到所有用户都收到了消息。6、私聊用户yikou给用户111发了一条消息:从下图可以看出,只有用户111收到了消息,其他用户没有收到消息。7.显示在线用户。8.查看最终的数据库信息。要切换到没有数据库的版本,请执行以下命令。gitreset--hard597330ae0a183c9db8f68b7c9f60df94f8965778切换回有数据库的版本,执行以下命令:gitreset--hard10bfbfaf2d09ae895313273c960ecfd84663f9fd使用数据库后,数据存储管理更方便,数据类型更容易扩展,逻辑关系更清晰本文转载自微信公众号《一口Linux》
