news 2026/4/19 4:31:25

C++实现分布式集群聊天服务器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++实现分布式集群聊天服务器

一、项目整体架构

我做的项目是集群版聊天服务器,核心技术栈:

  • C++11 + Muduo 网络库(Reactor 高并发模型)
  • MySQL 数据持久化(用户 / 好友 / 群组 / 离线消息)
  • Redis 发布订阅(跨服务器消息转发,实现集群)
  • nlohmann json 序列化(客户端 <-> 服务器通信协议)
  • 单例模式(Service 业务层、DB 数据库)

项目分层

  1. 网络层ChatServer—— 只处理连接、读写事件,不处理业务
  2. 业务层ChatService—— 所有聊天业务逻辑(登录、注册、聊天、群聊)
  3. 数据模型层User/Group/Friend/OfflineMessage—— 操作数据库
  4. 中间件MySQL+Redis
  5. 公共层public.hpp—— 全局枚举、协议、工具

二、逐文件梳理

第一部分:include 头文件(所有声明)

1. public.hpp

作用:全局公共头文件,客户端与服务器共用的通信协议

  • 定义消息类型枚举:登录、注册、一对一聊天、加好友、创建群组、群聊、退出登录等
  • 定义错误码、状态码
  • 提供通用工具函数(如字符串处理)
  • 所有业务模块都必须包含它

2. db.h

作用:MySQL 数据库连接单例类

  • 封装数据库连接、初始化、断开、更新、查询
  • 使用单例模式,保证全局只有一个数据库连接池 / 连接
  • 提供update()/query()接口给所有 Model 使用

3. user.hpp

作用:用户表实体类

  • 成员变量:idnamepasswordstate(在线 / 离线)
  • 提供 set/get 方法
  • 与数据库user表字段一一对应

4. usermodel.hpp

作用:用户数据操作类(DAO)

  • 接口:
    • insert注册用户
    • query根据 ID 查询用户
    • updateState更新在线 / 离线状态
    • resetState服务器异常下线,重置所有用户为离线

5. friendmodel.hpp

作用:好友关系操作类

  • 接口:
    • insert添加好友
    • query获取用户所有好友信息

6. groupuser.hpp

作用:群成员实体类

  • 继承 User,增加role字段(群主 / 普通成员)

7. group.hpp

作用:群组实体类

  • 成员:idgroupnamedesc
  • 包含群成员列表vector<GroupUser>

8. groupmodel.hpp

作用:群组数据操作类

  • 接口:
    • createGroup创建群组
    • joinGroup加入群组
    • queryGroups查询用户所在的所有群组
    • queryGroupUsers查询群内除自己外的所有成员

9. offlinemessagemodel.hpp

作用:离线消息存储操作

  • 接口:
    • insert存储离线消息
    • query获取离线消息
    • remove登录成功后删除离线消息

10. redis.hpp

作用:Redis 发布订阅封装,实现跨服务器通信

  • 接口:
    • connect连接 redis
    • publish发布消息
    • subscribe订阅通道
    • unsubscribe取消订阅
  • 启动独立线程监听 redis 消息,回调给业务层

11. chatserver.hpp

作用:网络层服务器类(基于 Muduo)

  • 封装muduo::net::TcpServer
  • 处理连接建立、断开、消息读写
  • 把读写事件转发给业务层 ChatService

12. chatservice.hpp

作用:业务层核心(单例),所有聊天功能实现

  • 采用单例模式,全局唯一
  • 使用回调映射表:根据消息类型调用对应业务函数
  • 核心成员:
    • _connMap记录在线用户连接(保证线程安全)
    • _userModel_friendModel等数据操作对象
    • _redis跨服务器消息组件
  • 业务函数:登录、注册、一对一聊天、加好友、创建群、群聊、退出、异常断开

第二部分:src 源文件(所有实现)

1. db.cpp

作用:数据库连接实现

  • 加载配置,连接 MySQL
  • 实现update()执行增删改
  • 实现query()执行查询
  • 自动释放结果集,防止内存泄漏

2. user.cpp / usermodel.cpp

作用:用户表操作实现

  • insert:执行 INSERT 语句,注册新用户
  • query:SELECT 查询用户信息(登录校验)
  • updateState:更新在线状态(online/offline)

3. friendmodel.cpp

作用:好友业务实现

  • 存储好友关系,查询好友列表
  • 登录时返回所有好友信息与在线状态

4. groupuser.cpp / group.cpp / groupmodel.cpp

作用:群组业务实现

  • 创建群、加入群、查询群、群聊消息转发
  • 群聊时获取所有群成员,逐个推送消息

5. offlinemessagemodel.cpp

作用:离线消息实现

  • 用户不在线 → 存储消息到数据库
  • 用户登录 → 读取并删除离线消息

6. redis.cpp

作用:Redis 发布订阅实现

  • 订阅通道:以用户 ID作为通道号
  • 服务器 A 发布 → 服务器 B 订阅 → 跨机消息送达
  • 用线程在后台阻塞监听消息,不阻塞网络线程

7. chatserver.cpp

作用:网络层实现

  • 初始化 Muduo 事件循环、地址、线程数
  • 设置连接回调(新连接 / 断开连接)
  • 设置消息回调(收到客户端数据)
  • 调用ChatService::instance()处理业务
  • 只负责网络,不处理业务逻辑

8. chatservice.cpp(最核心文件)

作用:所有业务逻辑实现

  • 登录业务:校验账号密码 → 更新在线状态 → 获取好友 / 离线消息 → 订阅 redis
  • 注册业务:插入用户数据到数据库
  • 一对一聊天
    • 目标用户在线本服务器 → 直接发
    • 在线其他服务器 → redis 发布
    • 不在线 → 存储离线消息
  • 加好友:双向插入好友关系
  • 创建群组:插入群组信息,把创建人设为群主
  • 群聊业务:获取群成员 → 逐个转发消息
  • 异常断开:重置用户状态、从连接表移除、取消订阅
  • 所有操作加互斥锁,保证多线程安全

9. main.cpp

作用:服务器入口函数

  • 创建事件循环EventLoop
  • 初始化ChatServer
  • 启动服务器
  • 处理信号(如 SIGINT),重置所有用户状态为离线

10. 所有 CMakeLists.txt

作用:项目编译配置

  • 规定 C++11 标准
  • 查找 Muduo、Boost、MySQL、Redis 依赖库
  • 指定头文件路径
  • 生成可执行文件到 bin 目录

11. autobuild.sh

作用:一键编译脚本

rm -rf build mkdir build cd build cmake .. make
  • 清空编译目录
  • CMake 生成 Makefile
  • make 编译,生成服务器可执行文件

三、项目运行流程

  1. 服务器启动 → 初始化数据库、redis、网络层
  2. 客户端连接 → Muduo 建立连接
  3. 客户端发送登录 / 注册 json
  4. 网络层解析消息类型 → 调用业务层
  5. 业务层查询数据库 → 响应客户端
  6. 聊天消息:
    • 本机在线 → 直接推送
    • 跨机在线 → redis 中转
    • 不在线 → 存入离线消息
  7. 客户端退出 → 服务器更新状态为离线

四、想要学习这个项目的步骤:

第 1 步:先学公共基础 + 数据结构

  1. public.hpp—— 通信协议、消息枚举(必须最先看)
  2. user.hpp/groupuser.hpp/group.hpp—— ORM 实体类
  3. db.h+db.cpp—— MySQL 封装(所有数据操作的基础)

第 2 步:学数据访问层 Model(纯数据库操作,无网络)

  1. usermodel.hpp/cpp—— 用户表操作
  2. friendmodel.hpp/cpp—— 好友关系
  3. offlinemessagemodel.hpp/cpp—— 离线消息
  4. groupmodel.hpp/cpp—— 群组操作

这一步学完:你懂数据库怎么存、怎么取、怎么用

第 3 步:学网络层(只负责收发数据,不处理业务)

  1. chatserver.hpp
  2. chatserver.cpp

这一步学完:你懂Muduo Reactor 模型、连接、读写事件

第 4 步:学业务核心层(最重要)

  1. chatservice.hpp
  2. chatservice.cpp

这一步学完:你懂登录、注册、聊天、加好友、群聊、异常处理全部逻辑。

第 5 步:学集群核心 Redis(分布式关键)

  1. redis.hpp
  2. redis.cpp

这一步学完:你懂跨服务器消息转发、发布订阅

第 6 步:学入口、编译、运行

  1. 服务器main.cpp
  2. 客户端main.cpp
  3. 所有CMakeLists.txt
  4. autobuild.sh

这一步学完:你懂项目怎么编译、怎么运行、怎么部署

第 7 步:整体串起来(跑通流程)

  1. 客户端 → 服务器 → 数据库 → Redis 完整流程
  2. 单机测试 → 集群测试
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 4:28:28

软件工程-热重载:从原理到实战,解锁高效开发新姿势

1. 热重载&#xff1a;开发者的效率加速器 第一次听说热重载这个概念时&#xff0c;我正在调试一个复杂的WPF界面。每次修改按钮样式后&#xff0c;都要经历漫长的编译等待——启动应用、导航到测试页面、点击按钮...这种重复操作让我抓狂。直到同事告诉我&#xff1a;"试…

作者头像 李华
网站建设 2026/4/19 4:24:31

Podman用户数据目录详解:为什么root拉的镜像普通用户看不到?

Podman用户数据隔离机制深度解析&#xff1a;为什么你的镜像在不同用户间"消失"了&#xff1f; 第一次在团队协作环境中使用Podman时&#xff0c;很多开发者都会遇到一个令人困惑的现象&#xff1a;用root账号拉取的镜像&#xff0c;切换到普通用户后执行podman imag…

作者头像 李华
网站建设 2026/4/19 4:23:59

如何轻松解锁Wallpaper Engine壁纸资源:RePKG完全指南

如何轻松解锁Wallpaper Engine壁纸资源&#xff1a;RePKG完全指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经对Wallpaper Engine中精美的壁纸感到好奇&#xff0c;想…

作者头像 李华