实现一个基于udp协议的网络多人聊天室,可以完成多人的实时信息交互任务。其实就是类似于实现qq的群聊。
系统环境
Ubuntu 编辑器:vim 编译器:g++ 调试器:gdb 辅助编译工具:Makefile
原理图
首先说的是client:
client要完成的功能当然首先就是数据的接收和发送了(都从server接收和发送给server),其次,作为一个client,没有一个窗口界面都不好意思出来混,所以借助ncurse库的窗口函数来实现多窗口界面。因为要将一个终端界面划分为4个窗口:分别是提示窗口(显示应用名称),消息窗口(显示聊天消息),输入窗口(数据输入),好友列表(在线用户列表),然后需要用到多线程的技术,让这四个窗口各自刷新。同时,它们访问的资源显示器所谓临界资源,所以需要信号量来实现互斥访问机制。
其次说sever:
server当然也要接收来自client的消息,并给client发送消息。那么接收到的消息先放到哪呢?我是这样实现的。server维护一个后端数据池。将从client接收到的数据全部放入后端数据池中,然后从数据池中取出数据依次发给每一个在线好友(所以也要有记录在线好友的结构,我用了map,,存放好友的套接字信息)。当然还要实现在线好友的添加与删除,即client输入quit,clinet退出,server将该client从在线好友列表中删除。
最后:
server与client之间通信的数据包括:昵称,学校信息,消息内容,还有命令(用以实现退出),所以又借助了jsoncpp的序列化与反序列化的技术,实现底层传输的数据格式。
整个程序框架说的差不多了,说说具体的模块划分:
client模块:实现client底层通信
server模块:提供server底层通信
windows模块:基于ncurse库,提供client窗口模功能
data_pool模块: 提供server数据池
comm模块:基于jsoncpp,实现数据的序列化与反序列化功能
源代码
已托管到GitHub: https://github.com/Fireplusplus/Project/tree/master/ChatSystem
运行结果
界面难看的一塌糊涂,暂且将就着看吧=_=||
顶部的提示窗口有滑动效果,字从左向右循环滚动。
当好友数量较多时,好友列表可以每隔几秒显示换一页显示。(由于这个博客写的有点晚,凑不齐当初的小组成员了,更找不到这么多人了,所以没办法展示这个效果了)
聊天室
最新推荐文章于 2022-05-17 14:55:10 发布