当前位置: 首页 > news >正文

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. 单机测试 → 集群测试
http://www.jsqmd.com/news/664110/

相关文章:

  • **基于ARKit的增强现实手势交互开发实战:从零构建沉浸式用户界面**在移动设备日益智能化的今天,**ARKit(
  • Node.js 与 MySQL 的深入探讨
  • Java+YOLOv11实战:彻底解决工业产线光照不均导致的识别误差
  • 如何计算SQL日期差值_使用DATEDIFF函数实现逻辑判断
  • UOS系统装LibreOffice总报错?实测解决‘权限不足’和‘应用商店安装失败’的3种方法
  • Cursor AI Pro破解工具:告别试用限制,永久享受VIP功能
  • 分手后复联聊天技巧,不卑微、不纠缠,轻松拉近距离
  • 别再死记硬背公式了!用Python+MATLAB仿真,带你直观理解SVPWM的矢量合成
  • 用Arduino Nano和MAX485模块DIY你的第一个舞台灯光控制器(DMX512从机接收教程)
  • jQuery 效果 - 淡入淡出
  • AGI通往超级智能的临界点已至?(2024全球12项实证指标深度解码)
  • 如何在Bootstrap中自定义Modal的弹出动画效果
  • ARM Streaming SVE模式中断延迟问题与优化方案
  • STM32F4+LAN8720A以太网调试避坑指南:从PHY硬复位到MAC帧收发(附Wireshark抓包验证)
  • STC8G1K08 ADC采样避坑指南:从寄存器配置到电压换算的实战细节
  • Vue3 安装指南
  • OpenClaw(小龙虾)Windows 一键部署保姆级教程
  • SITS2026认证清单曝光:87%的开源Copilot类项目尚未通过基础可追溯性测试
  • 告别枯燥文档!用LVGL官方模拟器在VSCode里快速玩转UI原型设计
  • 忽然想到了初恋,该怎么联系?体面不唐突,温柔不尴尬
  • 终极OpenCore指南:在PC上安装macOS的完整解决方案 [特殊字符]
  • jQuery 效果 - 滑动
  • 从零上手XMOS开发:XC语言混合编程、环境搭建避坑与资源导航全攻略
  • Vue.js 响应接口详解
  • STM32F4驱动SRAM实战:手把手教你用FSMC ModeA搞定62WV51216BLL(附避坑指南)
  • Windows平台APK安装终极指南:APK Installer完整解决方案
  • 3天内完成百万行COBOL→Python迁移?2026奇点大会演示银行核心系统零误差转换全流程
  • jQuery 效果- 动画
  • LCD9648点阵屏驱动避坑指南:从字库提取到SPI时序调试
  • LLM生成代码的依赖雪崩效应(实测数据:平均引入2.8个未声明间接依赖,CVE风险提升400%)