网络畅聊系统

来源:互联网 发布:ios 结构体数组 编辑:程序博客网 时间:2024/06/11 20:54

1、网络聊天系统简介
简单来说,这个聊天系统可以达到群聊的目的。客户端向服务器发送消息,服务器对这条消息进行转发。由于使用的是udp协议,所以服务器会维护一张用户列表,这个列表记录了所有向服务器发送过消息的客户地址。当某个客户端退出的时候,会向服务器发送一条特殊的指令,然后服务器将该客户地址从用户列表中删除。

2、Udp聊天系统原理图
这里写图片描述
从上图可以看到,服务器端使用生产者消费者模型,生产者从网络中拿数据存到数据池中,消费者从数据池中拿数据发送到网络中,从而达到转发的目的。

3、服务器
3.1、数据池
服务器端要维护一个数据池,使用过生产者消费者模型向数据池中写数据和读数据。所谓的数据池也就是一个环形队列而已。
数据池的类如下:
这里写图片描述

3.2、用户列表
由于使用的是UDP协议,所以服务器要维护一张用户列表。这个用户列表可以使用map,以用户的IP作为key,sockaddr_in作为value。
这里写图片描述

4、客户端
4.1客户端界面
我们需要为客户端编写一个用户界面,编写界面会用到ncurses开源库。
编写的界面如下图:
这里写图片描述
窗口类:
这里写图片描述

4.2、消息序列化和反序列化
为什么要对输入的消息进行序列化和反序列化呢?
我们不能直接将客户端输入框输入的内容发送给服务器,因为用户很多的话,最后就无法辨别消息是哪个用户所发的了,为此我们给每条消息都加上当前用户的信息。所以客户端给服务器发送的消息是由用户的信息和从输入框输入的消息拼接而成的。
还有就是,如果用户退出的话,服务器要将该用户从用户列表中移除。为此我们可以在客户端给服务器发送的消息中再拼接一个cmd字段,用来表示客户端是否退出。
序列化和反序列化的类:
这里写图片描述

这里写图片描述

4.3客户端如何退出
我们可以自定义信号处理函数,在信号处理函数中将cmd字段的值设置为非空,服务器拿到数据的时候,先反序列化解析出来cmd的值,判断是不是退出的信息,如果是的话就将该用户从用户列表删除。

4.4、如何维护四个窗口
我们用四个线程去分别管理四个窗口。

5、结果展示
这里写图片描述

这里写图片描述

6、项目源码
项目源码

2 2
原创粉丝点击