笔记参考腾讯课堂施磊老师课程:C++实现集群聊天服务器
技术栈
- Json序列化和反序列化
- muduo网络库开发
- nginx源码编译安装和环境部署
- nginx的tcp负载均衡器配置
- redis缓存服务器编程实践
- 基于发布-订阅的服务器中间件redis消息队列编程实践
- MySQL数据库编程
- CMake构建编译环境
- Github托管项目
项目需求
- 客户端新用户注册
- 客户端用户登录
- 添加好友和添加群组
- 好友聊天
- 群组聊天
- 离线消息
- nginx配置tcp负载均衡
- 集群聊天系统支持客户端跨服务器通信
项目目标
- 掌握服务器的网络I/O模块,业务模块,数据模块分层的设计思想
- 掌握C++ muduo网络库的编程以及实现原理
- 掌握Json的编程应用
- 掌握nginx配置部署tcp负载均衡器的应用以及原理
- 掌握服务器中间件的应用场景和基于发布-订阅的redis编程实践以及应用原理
- 掌握CMake构建自动化编译环境
- 掌握Github管理项目
开发环境
- ubuntu linux环境
- 安装Json开发库
- 安装boost + muduo网络库开发环境,参考博客:
https://blog.csdn.net/QIANGWEIYUAN/article/details/89023980
- 安装redis环境
- 安装mysql数据库环境
- 安装nginx
- 安装CMake环境
配置远程开发环境
windows+vscode配置远程linux开发环境
参考博客:https://blog.csdn.net/qq756684177/article/details/94236990
- linux系统运行sshd服务
- 在vscode上安装Remote Development插件,其依赖插件会自动安装
- 配置远程linux主机的信息
- 在vscode上开发远程连接linux
VS环境创建远程linux跨平台项目
参考博客:https://blog.csdn.net/QIANGWEIYUAN/article/details/89469717
vscode在linux环境下直接开发
网络搜索关键词
下载
链接: https://pan.baidu.com/s/1kXyXy5ct1OmIxu8uSfjS1g
提取码: 13gi
Json介绍
Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
一个优秀的Json三方库
JSON for Modern C++
是一个由德国大牛 nlohmann 编写的在 C++ 下使用的 JSON 库。
具有以下特点:
- 直观的语法
- 整个代码由一个头文件组成
json.hpp
,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便 - 使用 C++ 11 标准编写
- 使用 json 像使用 STL 容器一样
- STL 和 json 容器之间可以相互转换
- 严谨的测试:所有类都经过严格的单元测试,覆盖了 100% 的代码,包括所有特殊的行为。此外,还检查了 Valgrind 是否有内存泄漏。为了保持高质量,该项目遵循核心基础设施倡议(CII)的最佳实践
包含Json头文件
在网络中,常用的数据传输序列化格式有 XML、Json、ProtoBuf,在公司级别的项目中,大量的在使用 ProtoBuf 作为数据系列化的方式,以其数据压缩编码传输,占用带宽小,同样的数据信息,是 Json 的 1/10,XML 的 1/20,但是使用起来比 Json 稍复杂一些,所以项目中我们选择常用的 Json 格式来打包传输数据。
下面列举一些项目中用到的有关 Json 数据的序列化和反序列化代码,仅供参考!JSON for ModernC++这个三方库的使用非常简单,如下所示:
#include "json.hpp"
using json = nlohmann::json;
Json数据序列化
就是把我们想要打包的数据或者对象,直接处理成 Json 字符串。
1. 普通数据序列化
json js;
// 添加数组
js["id"] = {1,2,3,4,5};
// 添加key-value
js["name"] = "zhang san";
// 添加对象
js["msg"]["zhang san"] = "hello world";
js["msg"]["liu shuo"] = "hello china";
// 上面等同于下面这句一次性添加数组对象
js["msg"] = {{"zhang san", "hello world"}, {"liu shuo", "hello china"}};
cout << js << endl; //string sendBuf = js.dump(); 将json数据对象序列化成json字符串sendBuf
//cout << sendBuf.c_str() << endl;
上面js对象的序列化结果是:
{"id":[1,2,3,4,5],"msg":{"liu shuo":"hello china","zhang san":"hello world"},"name":"zhang san"}