前言:
最近在学进程间通信,所以做了一个小项目练习一下。主要用消息队列和socket(UDP)实现这个系统,并数据库存储数据,对C语言操作数据库不熟悉的可以参照我的这篇博客:https://www.cnblogs.com/liudw-0215/p/9593414.html,所有代码提交我的Github上,地址:https://github.com/ldw0215/Chat-System.git,可以自行下载,然后make一下就可以了。
一、项目要求
要求实现用户注册、用户登录功能,密码需加密显示
要求实现聊天功能,双方能互发消息
数据要求数据库存储
二、架构解析
主要流程图如下:
主要有客户端(用户)和服务端,客户端发送注册、登录请求,服务端回应请求,并且双方可以模拟聊天(互相发送消息),主要客户端请求界面见下图:
注册、登录使用消息队列进行通信的,聊天是通过socket(UDP)实现的!数据存在数据库中,需要一张数据表,建表数据语句如下:
复制代码
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL DEFAULT '',
`password` varchar(64) NOT NULL DEFAULT '',
`check` varchar(64) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8;
复制代码
三、客户端实现
client.c创建不同的消息队列的键,根据不同的消息类型的进行发送,并等待服务端响应,client.c代码如下:
View Code
注意,不同的通信,要用创建不同消息队列的键,并且消息类型也要不同!
四、服务端实现
服务端主要接送并响应客户端,主要创建不同的子进程,然后调用exec族函数,调用二进制文件,并通过消息队列接收阻塞执行,并建立信号,检测Ctrl+c信号,是进程退出,服务端响应截图如下:
其实现代码如下:
View Code
四、各模块及数据库解析
数据库是通过数据库函数实现的,需要头文件,并链上动态库-I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient,数据量比较小,之后还要考虑优化的问题;
注册、登录、聊天都是不同的.c文件生成二进制实现的:
注册通过消息队列接收用户名和密码存入数据库,代码如下:
View Code
登录也是通过消息队列接收用户名和密码,并从查询出数据,进行对比,是否可以登录,代码如下:
View Code
聊天是通过socket(UDP)实现的。
总结:通过做这种小项目学到了很多,也发现许多不足,最重要的就是架构能力,之前都是做一小块,没有大局观,虽然项目小,但五张俱全,很锻炼人,继续找项目做!
作者:柳德维
出处:https://www.cnblogs.com/liudw-0215/
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!https://www.cnblogs.com/liudw-0215/p/9606604.html