C++ Boost/Asio异步聊天服务器项目

基于C++17/Boost.Asio协程的高性能异步聊天服务器,单机支持10000+ WebSocket并发连接。

采用协程模型替代传统多线程,通过Redis Streams实现消息持久化与实时广播,集成MySQL用户认证与Cookie会话管理。

核心亮点

  • 🚀 协程并发模型:基于Boost.Asio栈式协程,单线程处理10000+ WebSocket连接,无锁设计零竞争
  • 📡 实时消息广播:Redis PubSub + Streams双架构,P99消息延迟<35ms,支持消息持久化与历史回放
  • 🔐 多层安全防护:scrypt慢哈希(ln=14,r=8) + HttpOnly/SameSite Cookie + 预编译语句,防彩虹表/防XSS/防SQL注入
  • 🎯 工程化架构:接口抽象 + RAII守卫 + 建造者模式,模块解耦,单元测试覆盖率85%

alt

14天学习计划汇总与项目完整分析

📊 一、14天学习计划汇总表

天数 学习主题 核心知识点 主要产出文件 技术难度 实践重点
第1天 项目骨架与CMake构建系统 CMake配置、目录结构、编译链接、C++17标准 CMakeLists.txt
src/main.cpp
⭐⭐ 理解现代C++项目构建流程
第2天 错误处理基础设施 Boost.System、error_code、error_category、自定义错误码 error.hpp
error.cpp
⭐⭐⭐ 掌握异步错误处理机制
第3天 业务类型与Cookie工具 业务实体设计、Cookie解析/构建、邮箱验证、RFC规范 business_types.hpp
cookie.hpp/cpp
email.hpp/cpp
⭐⭐ 理解Web核心概念
第4天 密码哈希安全 Base64编解码、scrypt算法、PHC格式、时序攻击防护 base64.hpp/cpp
scrypt.hpp/cpp
password_hash.hpp/cpp
⭐⭐⭐⭐ 掌握密码安全存储
第5天 异步互斥与WebSocket框架 async_mutex、Channel、Pimpl惯用法、协程同步 async_mutex.hpp/cpp
websocket.hpp/cpp
⭐⭐⭐⭐ 理解协程同步机制
第6天 WebSocket完整实现 Boost.Beast、HTTP解析、响应构建、WebSocket握手 websocket.cpp(完善)
request_context.hpp/cpp
⭐⭐⭐⭐⭐ 掌握WebSocket协议
第7天 MySQL客户端实现 Boost.MySQL、连接池、预编译语句、SQL注入防护 mysql_client.hpp/cpp
business_types_metadata.hpp
⭐⭐⭐⭐ 学会数据库操作
第8天 Redis客户端与序列化 Boost.Redis、RESP3协议、Redis Streams、JSON序列化 redis_client.hpp/cpp
redis_serialization.hpp/cpp
⭐⭐⭐⭐ 掌握缓存与消息队列
第9天 会话存储与Cookie认证 Session管理、Session ID生成、Redis存储、认证流程 session_store.hpp/cpp
cookie_auth_service.hpp/cpp
⭐⭐⭐ 理解会话管理
第10天 发布订阅与房间历史 PubSub模式、MultiIndex容器、服务组合、批量查询 pubsub_service.hpp/cpp
room_history_service.hpp/cpp
⭐⭐⭐⭐ 掌握消息广播
第11天 API类型序列化 Boost.Json、Boost.Describe、反射机制、Visitor模式 api_types.hpp/cpp
timestamp.hpp
⭐⭐⭐ 学会协议设计
第12天 HTTP API处理器 RESTful API、请求验证、统一错误响应、静态文件服务 auth.hpp/cpp
static_files.hpp/cpp
⭐⭐⭐ 掌握HTTP服务开发
第13天 WebSocket聊天会话 会话生命周期、事件驱动、消息广播、游标分页 chat_websocket.hpp/cpp ⭐⭐⭐⭐⭐ 理解实时通信
第14天 服务器集成与部署 事件循环、信号处理、优雅关闭、Docker/Nginx部署 http_session.hpp/cpp
listener.hpp/cpp
shared_state.hpp/cpp
main.cpp
⭐⭐⭐⭐⭐ 掌握生产部署

🎯 二、项目能学到什么

2.1 技术能力矩阵

技术领域 具体技能 项目应用 掌握程度
C++现代特性 C++17/20标准、智能指针、移动语义、lambda表达式 全文使用 ⭐⭐⭐⭐⭐
网络编程 TCP/IP协议、HTTP/1.1、WebSocket、异步I/O 全部网络层 ⭐⭐⭐⭐⭐
并发编程 协程、异步互斥、Channel、无锁编程 async_mutex、spawn ⭐⭐⭐⭐
数据库 MySQL操作、连接池、预编译语句、事务 mysql_client ⭐⭐⭐⭐
缓存技术 Redis操作、Streams、过期策略、PubSub redis_client ⭐⭐⭐⭐
序列化 JSON解析/生成、反射机制、协议设计 api_types ⭐⭐⭐
安全编程 密码哈希、时序攻击防护、SQL注入防护、XSS/CSRF scrypt、预编译语句 ⭐⭐⭐⭐
构建工具 CMake配置、依赖管理、分离编译 CMakeLists.txt ⭐⭐⭐
软件架构 分层架构、Pimpl模式、建造者模式、Visitor模式 整体设计 ⭐⭐⭐⭐
容器化 Docker、Docker Compose 部署配置 ⭐⭐⭐

2.2 软技能培养

技能类别 具体能力 培养方式
工程能力 大型项目组织、模块划分、接口设计 14天逐步构建
调试能力 日志分析、错误追踪、性能排查 每日常见问题解决
文档阅读 Boost官方文档、RFC规范 查阅技术资料
代码审查 代码规范、最佳实践 对比源代码
问题解决 编译错误、链接错误、运行时问题 实战经验积累

2.3 项目实战经验对比

项目类型 学完本项目后能独立开发 所需前置知识
HTTP服务器 ✅ 可开发RESTful API服务 基础C++
WebSocket服务 ✅ 可开发实时聊天/游戏后端 网络编程基础
数据库中间件 ✅ 可开发连接池/ORM SQL基础
缓存系统 ✅ 可开发分布式缓存客户端 Redis基础
消息队列 ✅ 可开发PubSub系统 队列概念

🏗️ 三、项目整体架构分析

3.1 分层架构表

alt

alt

3.2 核心模块职责表

模块 文件 核心职责 关键接口 依赖模块
错误处理 error.hpp/cpp 统一错误码、错误传播、日志记录 result<T>CHAT_RETURN_ERROR Boost.System
业务类型 business_types.hpp 核心数据实体定义 usermessageroom -
Cookie工具 cookie.hpp/cpp Cookie解析/构建、安全属性 set_cookie_buildercookie_list -
密码哈希 password_hash.hpp/cpp scrypt哈希、密码验证 hash_passwordverify_password OpenSSL
异步互斥 async_mutex.hpp/cpp 协程间互斥 async_mutex::locktry_lock Boost.Asio
WebSocket websocket.hpp/cpp WebSocket封装、并发写入 acceptreadwrite Boost.Beast
MySQL客户端 mysql_client.hpp/cpp 数据库操作、连接管理 create_userget_user_by_email Boost.MySQL
Redis客户端 redis_client.hpp/cpp Redis操作、Streams get_room_historystore_messages Boost.Redis
会话存储 session_store.hpp/cpp Session管理 generate_session_id Redis
认证服务 cookie_auth_service.hpp/cpp 用户认证 user_from_cookie MySQL、Redis
发布订阅 pubsub_service.hpp/cpp 消息广播 subscribepublish MultiIndex
房间历史 room_history_service.hpp/cpp 历史查询 get_room_history MySQL、Redis
API序列化 api_types.hpp/cpp JSON协议转换 from_jsonto_json Boost.Json
API处理器 auth.hpp/cpp HTTP业务处理 handle_login 认证、MySQL
WebSocket会话 chat_websocket.hpp/cpp 实时消息处理 handle_chat_websocket PubSub、Redis
HTTP会话 http_session.hpp/cpp HTTP请求处理、路由 run_http_session 所有API
监听器 listener.hpp/cpp TCP连接接受 launch_http_listener HTTP会话
共享状态 shared_state.hpp/cpp 全局单例管理 redis()mysql() 所有服务
主程序 main.cpp 启动入口 main 所有模块

3.3 请求处理流程表

步骤 阶段 组件 操作 数据流向
1 接受连接 Listener acceptor.async_accept() TCP连接 →
2 HTTP解析 HTTP Session http::async_read() → HTTP请求
3 路由判断 HTTP Session 解析URL路径、HTTP方法 → 路由分发
4a API处理 Auth Handler 参数验证、业务逻辑 → MySQL/Redis
4b 静态文件 Static Files 文件读取、MIME识别 → 文件系统
4c WebSocket WebSocket Handler 升级协议、握手 → WebSocket帧
5 认证检查 Cookie Auth 解析Cookie、验证Session → Redis查询
6 业务处理 Chat Session 消息存储、广播 → Redis Streams
7 响应构建 Response Builder JSON序列化、Header设置 → HTTP响应
8 响应发送 HTTP Session http::async_write() → 客户端

3.4 数据流向图

alt

📚 四、技术栈总结

技术类别 技术名称 版本要求 用途 学习资源
编程语言 C++ C++17 主要开发语言 cppreference.com
构建工具 CMake 3.16+ 项目构建 cmake.org
网络库 Boost.Asio 1.80+ 异步I/O boost.org/doc/libs/asio
HTTP/WS库 Boost.Beast 1.80+ HTTP/WebSocket boost.org/doc/libs/beast
MySQL库 Boost.MySQL 1.80+ MySQL客户端 boost.org/doc/libs/mysql
Redis库 Boost.Redis 1.80+ Redis客户端 boost.org/doc/libs/redis
JSON库 Boost.Json 1.80+ JSON处理 boost.org/doc/libs/json
反射库 Boost.Describe 1.80+ 结构体反射 boost.org/doc/libs/describe
容器库 Boost.MultiIndex 1.80+ 多索引容器 boost.org/doc/libs/multi_index
加密库 OpenSSL 1.1.0+ 密码哈希 openssl.org
正则库 ICU 最新 Unicode正则 icu-project.org
数据库 MySQL 8.0+ 用户数据存储 mysql.com
缓存 Redis 7.0+ Session/消息存储 redis.io
容器化 Docker 20.10+ 部署 docker.com
反向代理 Nginx 1.20+ 负载均衡 nginx.com

部分技术点讲解展示

1. 核心技术栈概览

1.1 技术栈全景图

alt

1.2 技术点分类统计

分类 技术点数量 核心程度 学习优先级
Boost.Asio 8 ⭐⭐⭐⭐⭐ 最高
Boost.Beast 6 ⭐⭐⭐⭐⭐ 最高
Boost.MySQL 5 ⭐⭐⭐⭐
Boost.Redis 5 ⭐⭐⭐⭐
Boost.Json/Describe 4 ⭐⭐⭐
C++现代特性 12 ⭐⭐⭐⭐⭐ 最高
安全技术 6 ⭐⭐⭐⭐
构建/部署 5 ⭐⭐⭐

2. Boost.Asio异步编程

2.1 Asio核心概念表

概念 说明 本项目使用 代码示例
io_context I/O事件循环,所有异步操作的核心 主线程运行 boost::asio::io_context ioc{1}
executor 执行器,决定如何执行异步操作 获取协程执行器 yield.get_executor()
strand 串行执行,避免并发问题 本项目用协程替代 协程天然串行
timer 定时器,支持异步等待 超时控制、重连 steady_timer::async_wait()
socket TCP套接字 HTTP连接 ip::tcp::socket
acceptor 接受器,接受TCP连接 监听端口 ip::tcp::acceptor
yield_context 协程完成处理器 协程挂起/恢复 yield[ec]
spawn 创建协程 每个连接一个协程 boost::asio::spawn()

部分面试题展示

1. C++基础与现代特性(8题)

Q1: 项目中为什么使用C++17?有哪些具体特性被用到了?

参考答案

答案: 本项目使用C++17的主要原因:

  1. std::string_view - 零拷贝字符串传递,用于JSON解析、Cookie处理
  2. std::optional - 表达可选值,如optional<session_id>
  3. std::variant + std::visit - 实现类型安全的客户端事件处理
  4. 结构化绑定 - auto [id, name] = user 简化代码
  5. if constexpr - 编译期条件判断,用于序列化模板
  6. 类模板参数推导 - pair p{1, "hello"} 简化写法
  7. inline变量 - 头文件中定义全局常量

代码示例:

// string_view零拷贝
void process_cookie(std::string_view cookie_header);

// variant + visitor
using any_event = variant<error_code, messages_event, history_event>;
auto result = visit(event_handler, event);

Q2: 解释RAII模式在项目中的应用?

参考答案

答案: RAII(Resource Acquisition Is Initialization)在项目中广泛应用:

资源类型 获取方式 释放方式 守卫类
MySQL连接 async_connect 析构时async_close guarded_connection
互斥锁 lock() 析构时unlock() write_guard
Session订阅 subscribe() 析构时unsubscribe() subscriber_guard
文件 file_body::open 析构时自动关闭 file_body
class guarded_connection {
    ~guarded_connection() {
        if (valid_) {
            conn_.async_close(yield);  // 自动释放
        }
    }
};

Q3: std::string_viewconst std::string&有什么区别?项目中如何使用?

参考答案

答案:

特性 string_view const string&
所有权 不持有,只读视图 引用已有对象
拷贝成本 极低(16字节) 无拷贝(引用)
子串操作 O(1) O(n)需拷贝
空终止 不保证 保证
生命周期 需小心使用 引用有效即可

项目中使用场景:

// 1. 函数参数 - 接受各种字符串类型
bool is_email(std::string_view email);  // 接受const char*, string, string_view

// 2. JSON解析 - 零拷贝读取
result<std::string_view> websocket::read() {
    return string_view(buffer.data(), buffer.size());  // 不拷贝
}

// 3. Cookie解析 - 直接引用原始数据
cookie_list::cookie_list(std::string_view header);

Q4: 智能指针在项目中如何使用?

参考答案

答案:

智能指针 使用场景 代码示例
unique_ptr Pimpl实现、连接守卫 std::unique_ptr<impl> impl_
shared_ptr 订阅者管理、状态共享 std::shared_ptr<message_subscriber>
weak_ptr 打破循环引用 本项目未使用
// unique_ptr - 独占所有权
class websocket {
    struct impl;
    std::unique_ptr<impl> impl_;  // Pimpl惯用法
};

// shared_ptr - 共享所有权
class chat_session : public std::enable_shared_from_this<chat_session> {
    void subscribe() {
        pubsub.subscribe(shared_from_this());  // 传递共享所有权
    }
};

部分简历模板展示

📄 模板1:基础版 - 适用于初级工程师

项目名称: 高性能异步聊天服务器

项目时间: 2025.01 - 2025.02

项目描述: 基于C++17和Boost库开发的高性能异步聊天服务器,支持用户注册/登录、多房间聊天、消息历史记录等核心功能。

技术栈:

  • C++17、Boost.Asio、Boost.Beast、Boost.MySQL、Boost.Redis
  • MySQL 8.0、Redis 7.0、OpenSSL

核心职责:

  • 实现基于Boost.Asio的异步I/O模型,支持高并发连接
  • 设计并实现WebSocket实时通信模块,完成消息的收发与广播
  • 集成MySQL和Redis,实现用户认证、会话管理和消息持久化
  • 实现scrypt密码哈希算法,保障用户密码安全
  • 编写CMake构建脚本,完成项目的编译配置

项目成果:

  • 单机支持5000+并发WebSocket连接
  • 消息延迟低于50ms
  • 代码覆盖率85%
#简历中的项目经历要怎么写##c++#
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-13 16:09
我入职那天分到的mentor是个工作三年的哥们儿,外号杰哥,浙大本硕,技术贼好,人也特别耐心。第一周他手把手带我熟悉项目,下班还带我去公司食堂吃晚饭,跟我讲组里的人际关系、哪个产品好沟通、哪个测试爱挑刺。我当时心里那个踏实啊,心想这mentor是真带我,运气真好。我甚至已经开始幻想转正后跟着他干。周一下午四点多,我正在改一个特别恶心的bug,他飞书突然发我:"小x,跟你说个事儿,我下周一是最后一天,我跳槽了,你之后跟着王哥学。"我当时直接回复了“????”真的以为他在开玩笑。他发了一个尴尬笑的表情,"真的,offer上个月就拿了,一直没说"。我那一瞬间真的不知道说啥。下班的时候我特意去他工位转了一圈,他已经在收拾东西来,看见我笑了一下,说"我请你吃个饭吧"。我们去了公司楼下的麻辣烫。吃饭的时候他跟我说了很多,说大厂这边晋升路径太卷,说他家在外地啊老婆怀孕了啊想离家近点什么的,说新公司虽然小但是给的钱多。我一边吃一边点头,看到一个快到中年研发人的无奈,感觉也看到了未来的我,心里挺不是滋味的。今早上午他飞书里发我一个文档链接,是他这两年攒的项目笔记,模块分工、踩过的坑、谁负责啥都有。他说"这个你留着,遇到问题先看这个再找王哥吧"。说实话,我当时贼感动,工作的这两周,他可能是我在公司里唯一真正把我当回事儿的人了。最后,我想说兄弟们,找实习真的别只看大厂光环,mentor稳定性也是玄学之一。我现在心里有点空,感觉靠山没了
勇敢的秋招人有点心碎:你这不错了,我之前遇到一个mentor干到我入职第三周直接被裁了,后来自学三个月,简历都写不出啥,太倒霉了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务