C++ 手写 Web 服务器:基于 JSON 与 HTTP 协议的实现
引言
在之前的网络编程实践中,我们深入探讨了序列化与反序列化的概念。对于 TCP 通信双方,由于 TCP 是面向字节流的,发送数据前通常需要定义结构化数据作为容器。在 C++ 中,这通常表现为对象或结构体。然而,直接传递内存字节会引发字节序和内存对齐问题,不同平台和编译器规则不一,可能导致解析错误。
因此,我们需要借助序列化。序列化将结构化数据按预定规则转换为连续字节流,屏蔽平台差异。主要分为文本序列化(如 JSON)与二进制序列化(如 Protobuf)。文本序列化直观、可读性高,便于调试;二进制序列化体积更小、解析更快。在实际开发中,成熟的第三方库能提供更完善的实现。
| 特性 | 文本序列化 (JSON/XML) | 二进制序列化 (Protobuf/Thrift) |
|---|---|---|
| 可读性 | 极高(肉眼可读) | 低(十六进制乱码) |
| 传输体积 | 较大 | 极小 |
| 解析速度 | 较慢 | 极快 |
| 跨语言 | 完美 | 优秀 |
JSON 基础与使用
JSON(JavaScript Object Notation)是一种轻量级、基于文本的数据交换格式。它源于 JavaScript,但已被多种语言支持。JSON 本质上是符合规范的字符串,支持整型、浮点型、布尔型、字符串、对象和数组等类型。
nlohmann/json 库
C++ 中常用的 JSON 库是 json.hpp(即 nlohmann/json)。它是一个单头文件库,无需编译安装,只需引入即可。
初始化与操作
#include "json.hpp"
#include <iostream>
using json = nlohmann::json;
int main() {
// 列表初始化
json j1 = {{"name", "WZ"}, {"age", 20}};
// 赋值运算符初始化
json j2;
j2["name"] = "wz";
j2["age"] = ;
std::cout << j() << std::endl;
;
}


