mini聊天室(Linux下基于UDP实现的群聊系统)
一.原理
(1)客户端从标准输入读取数据,将数据序列化后发送至网络;
(2)服务器端使用多线程+生产者消费者模型;
- 生产者从网络中读取数据,并将读取到的用户信息添加至用户列表,将数据放至数据池中;
- 消费者从数据池读取数据,并广播给所有在用户列表中的用户。
(3)数据经过网络以后,反序列化再次发送给客户端,实现群聊功能。
二.所用技术
平台:Centos7.0,64位操作系统
语言:C/C++
编译工具:g++
序列化和反序列化工具:jsoncpp
窗口设计框架:ncurse/ncurses
其他:生产者消费者模型,信号量互斥机制,多线程编程,socket套接字编程
三.系统框架
server模块:收到用户发送的字符串以后,将用户信息存储到在线用户列表中,将数据存储到数据池中,再将数据广播给所有的在线用户;
client模块:从标准输入读取用户数据,并且将字符串序列化,发送给服务器;接收到服务器的数据以后,反序列化输出到消息输出框;
data_pool模块:数据池,存放用户发过来的数据,使用一个环形队列描述的;
window模块:显示用户界面,使用ncurses库实现;
四.具体模块
server:
部分成员函数介绍:
addrUser:将上线用户添加至online用户列表中;
delUser:将下线用户从online用户列表中删除;
RecvData:接受客户端发送到网络中的数据,并且判断用户的cmd状态是否是“QUIT”,若是“QUIT”就调用del将该用户从online用户列表中删除,若不是“QUIT”就将该用户数据存放至数据池;
SendData:将数据发送给所有在online用户列表中的用户;
部分成员变量的介绍:
std::map<int,struct sockaddr_in> online:维护一个在线用户列表,使用的是STL中的map数据结构,以ip为key值,sockaddr_in结构体为value值,可以通过ip地址查找到对应的用户;
client:
client这里定义的比较简单,进行数据的收发,但主逻辑部分就比较复杂了。
首先,我们使用的是多线程,为了使用户端聊天室的每一个部分都独立(主要分为标题,输出框,输入框)。
(1)标题部分:实现左右滚动的播放标题头部信息;
(2)输出框:输出分为用户数据和在线成员列表,并且实现满屏就清屏的效果;
(3)输入框:用户输入要发送的消息,按回车键就发送出去。
data_pool:
data_pool是实现一个数据池,将用户发来的数据都存储在数据池中,服务器要广播数据的时候,就从数据池中拿取数据;
这里使用生产者消费者模型,完成资源的同步与互斥,使用vector维护一个环形队列,生产者只在意环形队列的空格资源,消费者只在意数据资源。
window:
因为客户端是多线程并发执行数据,所以这里我们使用互斥锁来保证线程安全。
window模块主要是实现客户端界面,设计的大概效果如下:
comm:
这一部分主要实现数据的序列化和反序列化,使用C++第三方库jsoncpp来完成;
并且将序列化和反序列化进行简单的封装:
发送的数据会有昵称、学校、消息内容、状态信息,客户端将这些数据发送出去,序列化为一个字符串发送至网络中,服务器接收到数据以后,再将字符串反序列化为用户信息,进行分别存储和处理。
四.聊天效果图
项目源码:https://gitee.com/ypttest/chat_system
mini聊天室(Linux下基于UDP实现的群聊系统)相关推荐
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能...
休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...
- 聊天室案例,模仿QQ,微信群聊
使用说明 这个代码是模拟一个简单的QQ,微信群聊,首先运行服务端代码,在运行客户端,每运行一次客户端,都会创建一个用户在聊天室中模拟发言.(注:服务端要一直处于开启状态,不能关闭) 客户端代码 imp ...
- linux下和嵌入式linux下通过udp接收来自vlc播放器的视频并转发播放
1.最近需要在linux下基于udp写一个应用程序,实现接收vlc播放器发送的视频流,并将接收到的视频流转发到另一个vlc客户端播放.并将这个应用程序交叉编译到ARM上执行测试通过.主机端ip地址:1 ...
- 群聊系统项目(基于TCP、UDP实现)
最近学习了网络编程后, 写了一个基于TCP.UDP协议的群聊系统. 技术栈 1.TCP.UDP通信 2.生产.消费模型, 支持并发 3.自定义协议封装数据 & json ...
- linux 下基于jrtplib库的实时传送实现
linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术 实时传输协议(Real-time Transport Protocol,PRT)是在 Inter ...
- linux下基于jrtplib库的实时传送实现
linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术 实时传输协议(Real-time Transport Protocol,PRT)是在 Inte ...
- linux系统最好的c类语言开发软件,Linux下基于C 语言开发即时通信软件.doc
Linux下基于C 语言开发即时通信软件 Linux下基于C++语言开发即时通信软件 关键词:聊天软件 文字聊天 Linux平台 C/S架构ICE中间件 Linux-based instant mes ...
- Linux下基于TCP的简易文件传输(socket编程)
Linux下基于TCP的简易文件传输(socket编程) OSI和TCP/IP: 关于TCP/IP协议 关于TCP协议 TCP编程的一般步骤[^2] TCP文件传输实现 功能概述 服务器编程 客户端编 ...
- Linux下基于密钥的安全验证实现方法
Linux下基于密钥的安全验证实现方法 -------OpenSSH+WinSCP+putty密钥生成器+putty 实验背景: 小诺公司目前已使用Linux搭建了各个服务器(FTP.DNS.Apac ...
- Linux下基于Libmad库的MP3音乐播放器编写
linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...
最新文章
- Loj #3111. 「SDOI2019」染色
- 有了螃蟹让心情好一点
- npm:no such file /usr/local/lib/node_modules/vue-cli/node_modules/get-stream
- (1)Zabbix2.4.5 安装配置
- find命令日常用法和文件名后缀
- Python:批量转换图片格式
- Objective-C 入门教程
- 269个JavaScript工具函数,助你提升工作效率(2)
- 软件系统演示脚本实践(草稿)
- 取自开源,分享于开源 —— 利用CVE-2017-8890漏洞ROOT天猫魔屏A1
- 微信小程序-中英文文本换行的小问题
- elasticsearch7.6 词频统计
- 【浅析华容道之一】华容道的前世今生
- Java基于springboot开发的财务咨询系统代理记账系统有论文
- 一年省下1000亿? 原来零售玩的是闷声发大财
- SFX: constructing constants
- python endwith_Python endswith()方法 - Python 教程 - 自强学堂
- 信号与线性系统知识点整理1-2
- 学习笔记 Matlab 命令 -4
- 【USB】Zadig 工具的使用说明与下载
热门文章
- 线性分类器三种最优准则
- 概率图模型(05): 揭示局部概率模型, 稀疏化网络表示(Structured-CPDs)
- 远程办公:常用的远程协助软件,你都知道吗?
- redis配置文件参数说明及命令操作
- java复习快速导航
- 软件测试师和网络工程师,【软件测试工程师(科技部)网络工程师面试题目|面试经验】-看准网...
- rpc调用过程原理分析以及Dubbo、Feign调用过程
- TwinCAT 3 报警程序
- MySQL大表优化方案
- 【分享】班组5S管理实践办法