一.原理

(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实现的群聊系统)相关推荐

  1. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能...

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

  2. 聊天室案例,模仿QQ,微信群聊

    使用说明 这个代码是模拟一个简单的QQ,微信群聊,首先运行服务端代码,在运行客户端,每运行一次客户端,都会创建一个用户在聊天室中模拟发言.(注:服务端要一直处于开启状态,不能关闭) 客户端代码 imp ...

  3. linux下和嵌入式linux下通过udp接收来自vlc播放器的视频并转发播放

    1.最近需要在linux下基于udp写一个应用程序,实现接收vlc播放器发送的视频流,并将接收到的视频流转发到另一个vlc客户端播放.并将这个应用程序交叉编译到ARM上执行测试通过.主机端ip地址:1 ...

  4. 群聊系统项目(基于TCP、UDP实现)

    最近学习了网络编程后, 写了一个基于TCP.UDP协议的群聊系统. 技术栈 1.TCP.UDP通信       2.生产.消费模型, 支持并发       3.自定义协议封装数据 & json ...

  5. linux 下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术 实时传输协议(Real-time Transport Protocol,PRT)是在 Inter ...

  6. linux下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术  实时传输协议(Real-time Transport Protocol,PRT)是在 Inte ...

  7. linux系统最好的c类语言开发软件,Linux下基于C 语言开发即时通信软件.doc

    Linux下基于C 语言开发即时通信软件 Linux下基于C++语言开发即时通信软件 关键词:聊天软件 文字聊天 Linux平台 C/S架构ICE中间件 Linux-based instant mes ...

  8. Linux下基于TCP的简易文件传输(socket编程)

    Linux下基于TCP的简易文件传输(socket编程) OSI和TCP/IP: 关于TCP/IP协议 关于TCP协议 TCP编程的一般步骤[^2] TCP文件传输实现 功能概述 服务器编程 客户端编 ...

  9. Linux下基于密钥的安全验证实现方法

    Linux下基于密钥的安全验证实现方法 -------OpenSSH+WinSCP+putty密钥生成器+putty 实验背景: 小诺公司目前已使用Linux搭建了各个服务器(FTP.DNS.Apac ...

  10. Linux下基于Libmad库的MP3音乐播放器编写

    linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...

最新文章

  1. Loj #3111. 「SDOI2019」染色
  2. 有了螃蟹让心情好一点
  3. npm:no such file /usr/local/lib/node_modules/vue-cli/node_modules/get-stream
  4. (1)Zabbix2.4.5 安装配置
  5. find命令日常用法和文件名后缀
  6. Python:批量转换图片格式
  7. Objective-C 入门教程
  8. 269个JavaScript工具函数,助你提升工作效率(2)
  9. 软件系统演示脚本实践(草稿)
  10. 取自开源,分享于开源 —— 利用CVE-2017-8890漏洞ROOT天猫魔屏A1
  11. 微信小程序-中英文文本换行的小问题
  12. elasticsearch7.6 词频统计
  13. 【浅析华容道之一】华容道的前世今生
  14. Java基于springboot开发的财务咨询系统代理记账系统有论文
  15. 一年省下1000亿? 原来零售玩的是闷声发大财
  16. SFX: constructing constants
  17. python endwith_Python endswith()方法 - Python 教程 - 自强学堂
  18. 信号与线性系统知识点整理1-2
  19. 学习笔记 Matlab 命令 -4
  20. 【USB】Zadig 工具的使用说明与下载

热门文章

  1. 线性分类器三种最优准则
  2. 概率图模型(05): 揭示局部概率模型, 稀疏化网络表示(Structured-CPDs)
  3. 远程办公:常用的远程协助软件,你都知道吗?
  4. redis配置文件参数说明及命令操作
  5. java复习快速导航
  6. 软件测试师和网络工程师,【软件测试工程师(科技部)网络工程师面试题目|面试经验】-看准网...
  7. rpc调用过程原理分析以及Dubbo、Feign调用过程
  8. TwinCAT 3 报警程序
  9. MySQL大表优化方案
  10. 【分享】班组5S管理实践办法