用 C++ 搭一个 JSON/HTTP Web 服务器
序列化先说清楚
TCP 传的是字节流,不会替你保留'这段数据原来是个对象'的信息。真要把结构化数据发出去,序列化基本绕不开。直接把内存里的字节原样扔过去,字节序、内存对齐、平台差异都会冒出来,调试起来很不舒服。
JSON 和 Protobuf 是两条常见路线。JSON 直观、跨语言,肉眼也能看懂,代价是体积更大;Protobuf 更紧凑,但要多一层 schema 和解析成本。这里选 JSON,原因很简单:做一个能跑的 Web 服务器,先把链路走通比追求极致体积更实际。
nlohmann/json 的基本用法
实际写 C++ 时,我更倾向直接用成熟库,json.hpp(nlohmann/json)就够用了,没必要自己造轮子。
对象与数组初始化
#include "json.hpp"
#include <iostream>
int main() {
// 列表初始化
nlohmann::json j = {{"name", "WZ"}, {"age", 20}};
// 推荐方式:使用赋值运算符
nlohmann::json j2;
j2["name"] = "Alice";
j2["score"] = 95.5;
std::cout << j.dump(2) << std::endl; // dump(2) 表示缩进 2 格
return 0;
}
序列化与反序列化
- 序列化:调用
dump(),得到std::string。 - 反序列化:调用
parse();配合 C++11 原始字符串字面量R"()",转义会省事很多。
std::string s = R"({"msg": "Hello", "id": 123})";
nlohmann::json j = nlohmann::json::parse(s);
HTTP 报文长什么样
HTTP 是基于 TCP 的应用层协议,核心就是请求报文和响应报文。真正写服务端的时候,不用把它想得太神秘,本质上还是按格式拆字段。
URL 与域名解析
URL 里包含协议、域名、端口、路径等信息。浏览器输入地址后,先经过 DNS 把域名解析成 IP,再去建立 TCP 连接。没有这一步,后面都谈不上。


