![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
基于muduo的集群聊天服务器
文章平均质量分 56
使用muduo开发的集群聊天服务器,支持注册、登录、个人聊天,群组聊天功能。使用Nginx负载均衡模块,平摊用户流量。使用redis发布-订阅功能,实现多机器间的通信。
Last-Week
正在学习C++的小弱鸡
展开
-
(十五)使用Redis实现发布订阅功能
我们之前的ChatServer是维护了一个连接的用户表,每次向别的用户发消息都会从用户表中查看对端用户是否在线。然后再判断是直接发送,还是转为离线消息。但是现在我们是集群服务器,有多个服务器维护用户。我们的要聊天的对象在,在自己服务器的用户表中找不到。那么可能对端用户在线,它却给对端用户发送了离线消息。因此,我们需要保证跨服务器间的通信!那我们如何实现,非常直观的想法,我们可以让后端的服务器之间互相连接。原创 2022-09-28 17:40:09 · 1459 阅读 · 3 评论 -
(十四)引入负载均衡器
假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机器的性能毕竟是有限的,而且也有着摩尔定律也日已失效。这个时候我们就可以增加服务器的数量,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。那我们就需要有一个第三方组件充当负载均衡器,由它负责将不同的请求分发到不同的服务器上。而本项目,我们选择Nginx的负载均衡功能。选择Nginx的tcpclientChatServer。原创 2022-09-28 17:38:01 · 670 阅读 · 0 评论 -
(十三)客户端实现
真正操作时候还是需要实现一个客户端进行操作的,总不能一直手写数据。原创 2022-09-28 17:35:08 · 318 阅读 · 0 评论 -
(十二)群组业务
*AllGroup表 ****GroupUser表 **原创 2022-09-28 17:34:18 · 507 阅读 · 0 评论 -
(十一)添加好友业务
提供了向数据库DB层好友表的接口,有着添加好友关系和返回好友列表两个方法。原创 2022-09-28 17:32:32 · 464 阅读 · 0 评论 -
(十)服务端异常退出
之前讲解了客户端异常退出的代码,但是服务端也是会异常退出的。如果服务端异常退出,它会将所有在线的客户的状态都设置为offline。即,让所有用户都下线。异常退出一般是CTRL + C时,我们需要捕捉信号。这里使用了 Linux 的信号处理函数,我们向信号注册回调函数。函数的实现。原创 2022-09-28 17:31:31 · 521 阅读 · 0 评论 -
(九)离线消息业务代码
OfflineMessage表。原创 2022-09-28 17:30:16 · 216 阅读 · 0 评论 -
(八)点对点聊天业务处理
通过 JSON 对象的toid找寻对话用户原创 2022-09-28 17:29:08 · 244 阅读 · 0 评论 -
(七)客户端异常退出事件处理
如果客户端异常退出了,我们会从服务端记录用户连接的_connMap表中找到改用户,如果它断连了就从此表中删除,并设置其状态为offline。因为记录用户连接情况的表是可能被多个线程操作的,所以访问表的操作都要使用互斥锁进行保护。原创 2022-09-28 17:27:18 · 526 阅读 · 0 评论 -
(六)用户登录模块讲解
从json对象中获取用户ID和密码,并在数据库中查询获取用户信息。如果用户已经登录过,即,则返回错误信息。登录成功后,需要在用户表中记录新登录的用户。考虑到多线程对此map进行操作,我们需要使用互斥锁。遵守RALL手法,初始化即上锁,销毁即解锁。这里用临时作用域让锁得颗粒度变小,保证性能。原创 2022-09-28 17:25:29 · 448 阅读 · 0 评论 -
(五)用户注册模块讲解
在用户注册模块,由函数处理业务。我们从传递过来的json对象中获取用户 ID 和用户密码。并用此信息初始化一个User对象,其初始状态设置为offline。之后调用 model 层代码与数据库交互,插入这个用户的信息。若成功则发出response信息,记得需要将信息序列化,。原创 2022-09-22 18:06:33 · 1074 阅读 · 0 评论 -
(四)model数据层设计
对应着 MySQL 里的表字段设计,我们创建 User 类。原创 2022-09-22 18:04:20 · 607 阅读 · 0 评论 -
(三)MySQL模块封装
项目需要使用 MySQL 模块连接数据库,并进行增删改查操作。这里使用的是 MySQL 提供的 C 语言接口。这里创建 MySQL 类将这些接口封装,向上层 model 层提供各种服务。我们会按照多层封装,如果在上层随意调用 SQL 语句,那么代码结构将是混乱的。而且如果以后更改数据库,基本全部重写。原创 2022-09-22 18:02:37 · 522 阅读 · 1 评论 -
(二)网络模块和业务模块解耦,编写ChatService
ChatServiec 负责解耦业务模块和网络模块,其内部保存了各个业务模块的handler(业务函数)。考虑其的唯一性,我们使用单例模式。原创 2022-09-22 18:01:13 · 597 阅读 · 1 评论 -
(一)使用muduo编写网络模块ChatServer
我们会使用 muduo 完成网络模块的代码,在这之前我们需要了解 muduo 的基本使用。muduo 的线程模型为「one loop per thread + threadPool」模型。一个线程对应一个事件循环(EventLoop),也对应着一个 Reactor 模型。EventLoop 负责 IO 和定时器事件的分派。其中有和subReactor。通过Acceptor接收新连接,然后将新连接派发到subReactor上进行连接的维护。这样可以只专注于监听新连接的到来,而从维护旧连接的业务中得到解放。原创 2022-09-22 18:00:20 · 1269 阅读 · 0 评论 -
JSON For Modern C++使用
JSON 其实就是一种约定好的数据表示形式。我们按照这种 JSON 格式发送字符串,对面再按照这种格式解析得到想要的信息。{怎么理解 JSON 的「序列化」和「反序列化」呢?所谓的序列化就是将对象的状态转换为可保持或者输出的格式的过程,反序列化,就是将流转换为对象。上面的 JSON 案例就是将某个 JSON 对象序列化的结果,反序列化就是将上面的 JSON 案例转换成一个 JSON 对象。然后我们可以从 JSON 对象中获取某个键值对。原创 2022-09-22 17:51:26 · 1099 阅读 · 0 评论 -
集群聊天服务器项目(C++ 11实现)
在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册、用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。原创 2022-09-22 17:43:35 · 3591 阅读 · 1 评论