网络群聊系统
1、网络群聊系统简介
简单来说,这个聊天系统是参照《Linux高性能服务器编程》中有个简单的聊天系统实现的群聊功能。
服务器端负责接收客户端的消息,放到数据池中,还负责从数据池中取出数据转发给在线的客户端;
每个客户端负责发送和接收数据,还负责数据的序列化和反序列化。
2、网络群聊系统背景知识
(1)在Linux操作系统下实现,本人用的是CentOS 6.5
(2)熟悉Linux的开发环境,使用vim,g++/gcc, gdb,make/makefile, 会编写Makefile
(3) 熟悉UDP网络编程
(4)熟悉C/C++语言,以及STL容器的使用。
(5)熟悉生产者消费者模型,(本系统使用的是单消费者,单生产者)
(6)熟悉多线程编程,了解信号量
(7)了解shell编程,
(8)了解开源库jsoncpp,nucrse/ncursew
3、群聊系统的实现原理
从上图可以知道该系统的实现流程:服务器端使用生产者消费者模型,生产者从网络中拿数据存到数据池中,消费者从数据池中拿数据发送到网络中,从而达到转发的目的。
4、群聊系统系统框架
client模块:畅聊系统client上层逻辑,提供client底层通信
server模块:畅聊系统server上层逻辑,提供server底层通信
comm模块:畅聊系统底层公共逻辑,如数据序列化。
data_pool模块:数据池的实现
window模块:client窗口模块
lib第三⽅方库模块:提供第三⽅方库模块
conf模块:提供server的配置文件
plug插件起停服务脚本模块:起停服务脚本
5、详细模块介绍
5.1数据池
服务端要维护一个数据池,从数据池中存储和读取数据,数据池实际上是基于生产者消费者模型的环形队列。
数据池的类
5.2 服务器端
由于服务器端要转发数据给客户端,所以也要维护一张用户列表,本系统用map实现,用户ip作为key值,sockaddr_in作为value值。
5.3 客户端界面window
客户端界面使用ncures 库,提供基本的窗口界面,有点low…………
window.h 文件
5.5comm模块
分装jsoncpp库,实现数据的序列化和反序列化.
为什么要对输入的消息进行序列化和反序列化呢?
我们不能直接将客户端输入框输入的内容发送给服务器,因为用户很多的话,最后就无法辨别消息是哪个用户所发的了,为此我们给每条消息都加上当前用户的信息。所以客户端给服务器发送的消息是由用户的信息和从输入框输入的消息拼接而成的。
还有就是,如果用户退出的话,服务器要将该用户从用户列表中移除。为此我们可以在客户端给服务器发送的消息中再拼接一个cmd字段,用来表示客户端是否退出。
6客户端udp_client
采用多线程的方式,分别管理四个窗口,分别处理四个窗口事务。
结果演示
项目总结:
(1) 解决群聊系统中识别消息用户,编写data类,实现序列化与反序列化。
(2)解决客户端退出后,界面重置问题,使用信号捕捉函数,捕捉2号信号,执行信号注册函数。
(3)在项目中引入jsoncpp和ncures库,在编写makefile 编译链接库时,出现错误,jsoncpp库是64位版本,而centos6.5版本是32位版本,出现不兼容,找不到库的问题。
(4) 编写Makefile,出现库路径找不到情况。
项目源码
畅聊系统Chat System