cpp-httplib 是目前 C++ 生态最火、零依赖、单头文件的 HTTP 开源库,兼顾客户端 + 服务端 + WebSocket 全能力,支持 HTTP/HTTPS、文件上传、静态资源、拦截器中间件、RESTful 接口、WebSocket 双向长连接,兼容性极强。本文从零手把手教学,覆盖入门到生产级高阶实战,所有代码可直接编译运行,适配 Linux/Windows/Mac,适合 C++ 后台、嵌入式、工具接口、内网服务、实时通信场景开发。
一、cpp-httplib 核心介绍与优势
1.1 什么是 cpp-httplib?
cpp-httplib 是一款极简、高性能、Header-only 的 C++ HTTP 开源库,代码极简、无第三方依赖、跨平台,同时集成 HTTP 服务端、HTTP 客户端、WebSocket 长连接三大核心能力,是 Crow、Poco、Boost.Beast 的最佳平替方案,也是轻量 C++ Web 开发的首选框架。
1.2 核心优势(碾压同类库)
-
纯单头文件:仅需 httplib.h,无需编译、无需链接库
-
零依赖:无需 Boost、无需 libcurl、无需复杂环境
-
全栈能力:同时支持 HTTP服务端、HTTP客户端、WebSocket双向长连接
-
原生 HTTPS/WSS:一行代码开启 SSL 加密通信
-
开箱即用:文件上传、静态托管、跨域、路由、长连接全覆盖
-
高并发多线程:内置多线程模型,无需手动管理线程
-
MIT 开源:完全免费,商用无风险
1.3 适用场景
-
C++ 轻量级后端接口服务、内网网关
-
嵌入式、边缘设备内置 Web 服务、实时交互服务
-
本地工具、调试接口、自动化脚本 HTTP 调用
-
简易实时通信、设备心跳、消息推送、WebSocket长连接场景
二、环境搭建与编译配置
2.1 环境要求
-
C++ 标准:C++11 及以上(兼容性极强)
-
编译器:GCC、Clang、MSVC 全支持
-
可选依赖:OpenSSL(如需 HTTPS/WSS 加密功能)
2.2 获取源码(极简接入)
无需编译,直接下载单头文件即可使用:
# 克隆官方仓库
git clone https://github.com/yhirose/cpp-httplib.git
只需将仓库内 httplib.h 头文件放入项目目录即可。
2.3 通用 CMake 配置
cmake_minimum_required(VERSION 3.10)
project(HttplibDemo)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 引入头文件路径
include_directories(${CMAKE_SOURCE_DIR})
# 可执行文件
add_executable(httplib_server main.cpp)
# Linux必须添加线程库
find_package(Threads REQUIRED)
target_link_libraries(httplib_server Threads::Threads)
# 开启HTTPS/WSS时需要OpenSSL
# find_package(OpenSSL REQUIRED)
# target_link_libraries(httplib_server OpenSSL::SSL OpenSSL::Crypto)
2.4 快速编译命令
# Linux/Mac 普通编译(支持HTTP/WebSocket)
g++ main.cpp -o server -pthread
# 开启HTTPS/WSS加密编译
g++ main.cpp -o server -pthread -lssl -lcrypto
三、入门实战1:最简 HelloWorld 服务
10行代码搭建可运行 HTTP 服务,极简入门:
#include "httplib.h"
int main()
{
// 创建服务实例
httplib::Server svr;
// 根路由
svr.Get("/", [](const httplib::Request& req, httplib::Response& res) {
res.set_content("Hello cpp-httplib!高性能C++ HTTP框架", "text/plain");
});
// 监听所有网卡 8080端口
svr.listen("0.0.0.0", 8080);
return 0;
}
访问地址:http://127.0.0.1:8080
核心说明:cpp-httplib 默认多线程并发,天然支持高并发,无需额外配置。
四、入门实战2:GET 接口(路径参数 + Query参数)
4.1 动态路径参数
原生支持 RESTful 动态路由,基于正则自动匹配参数:
#include "httplib.h"
int main()
{
httplib::Server svr;
// 动态整型参数 /user/1001
svr.Get("/user/(\\\\d+)", [](const httplib::Request& req, httplib::Response& res) {
std::string uid = req.matches[1];
res.set_content("用户ID:" + uid, "text/plain");
});
// 动态字符串参数 /name/test
svr.Get("/name/(.*)", [](const httplib::Request& req, httplib::Response& res) {
res.set_content("Hello:" + req.matches[1], "text/plain");
});
svr.listen("0.0.0.0", 8080);
return 0;
}
4.2 Query 参数解析
svr.Get("/api/info", [](const httplib::Request& req, httplib::Response& res) {
// 获取query参数,支持默认值兜底
std::string name = req.get_param_value("name", "匿名用户");
std::string age = req.get_param_value("age", "0");
// 返回标准JSON格式
res.set_content(R"({
"code":200,
"msg":"success",
"data":{
"name":")" + name + R"(",
"age":)" + age + R"(
}
})" , "application/json");
});
测试地址:http://127.0.0.1:8080/api/info?name=CSDN&age=99
五、入门实战3:POST 接口 + JSON 交互
开发最常用的 JSON 提交场景,原生支持请求体读取,适配前后端联调:
#include "httplib.h"
int main()
{
httplib::Server svr;
svr.Post("/api/login", [](const httplib::Request& req, httplib::Response& res) {
// 判空请求体
if (req.body.empty())
{
res.status = 400;
res.set_content(R"({"code":400,"msg":"请求体不能为空"})", "application/json");
return;
}
// 模拟账号密码校验业务
if (req.body.find("admin") != std::string::npos && req.body.find("123456") != std::string::npos)
{
res.set_content(R"({
"code":200,
"msg":"登录成功",
"token":"httplib_xxxx_666"
})", "application/json");
}
else
{
res.status = 401;
res.set_content(R"({"code":401,"msg":"账号密码错误"})", "application/json");
}
});
svr.listen("0.0.0.0", 8080);
return 0;
}
六、进阶实战4:全局跨域 CORS 解决
前后端联调必备,通过前置拦截器全局统一跨域配置,无需每个接口单独设置:
#include "httplib.h"
int main()
{
httplib::Server svr;
// 全局前置拦截器:统一跨域处理
svr.set_pre_routing_handler([](const httplib::Request& req, httplib::Response& res) {
res.set_header("Access-Control-Allow-Origin", "*");
res.set_header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
res.set_header("Access-Control-Allow-Headers", "Content-Type,Authorization");
// 处理浏览器OPTIONS预检请求
if (req.method == httplib::OPTIONS)
{
res.status = 200;
return httplib::Server::HandlerResponse::Handled;
}
return httplib::Server::HandlerResponse::Unhandled;
});
svr.Get("/api/test", [](const httplib::Request& req, httplib::Response& res) {
res.set_content("跨域已全局生效", "text/plain");
});
svr.listen("0.0.0.0", 8080);
return 0;
}
七、进阶实战5:静态资源托管服务
一行代码托管静态文件夹,支持 html/js/css/图片等静态资源直接浏览器访问:
#include "httplib.h"
int main()
{
httplib::Server svr;
// 将本地 ./static 文件夹挂载到 /static 路由
svr.set_mount_point("/static", "./static");
std::cout << "静态服务启动:http://127.0.0.1:8080/static\\n";
svr.listen("0.0.0.0", 8080);
return 0;
}
访问示例:http://127.0.0.1:8080/static/index.html
八、进阶实战6:全局404异常兜底
统一拦截非法路由、不存在的接口,返回标准 JSON 格式,优化接口交互体验:
#include "httplib.h"
int main()
{
httplib::Server svr;
// 全局404兜底处理器
svr.set_error_handler([](const httplib::Request& req, httplib::Response& res) {
res.status = 404;
res.set_content(R"({"code":404,"msg":"接口不存在,请检查请求地址"})", "application/json");
});
svr.listen("0.0.0.0", 8080);
return 0;
}
九、高阶实战7:Multipart 表单文件上传
原生支持 form-data 表单解析,实现单/多文件批量上传,适配图片、文档、压缩包等业务上传场景:
#include "httplib.h"
#include <fstream>
#include <string>
// 二进制保存文件
bool saveFile(const std::string& path, const std::string& data)
{
std::ofstream f(path, std::ios::binary);
if (!f) return false;
f << data;
return true;
}
int main()
{
httplib::Server svr;
svr.Post("/api/upload", [](const httplib::Request& req, httplib::Response& res) {
// 获取普通表单参数
std::string prefix = req.get_param_value("prefix", "file");
// 遍历所有上传文件,批量保存
int succ = 0;
for (auto& file : req.files)
{
std::string savePath = "./" + prefix + "_" + file.second.filename;
if (saveFile(savePath, file.second.content))
succ++;
}
res.set_content(R"({
"code":200,
"msg":"上传成功",
"success_count":)" + std::to_string(succ) + R"(
})", "application/json");
});
svr.listen("0.0.0.0", 8080);
return 0;
}
测试方式:POST 提交 form-data 格式数据,支持多文件批量上传。
十、高阶实战8:HTTPS 加密服务部署
cpp-httplib 原生支持 SSL 加密,只需配置证书+私钥即可快速开启 HTTPS 安全通信,适配生产外网部署。
10.1 生成自签名测试证书
# 生成私钥
openssl genrsa -out server.key 2048
# 生成自签名证书
openssl req -new -x509 -key server.key -out server.crt -days 3650
10.2 HTTPS 完整可运行代码
#include "httplib.h"
int main()
{
// 创建SSL加密服务
httplib::SSLServer svr("./server.crt", "./server.key");
svr.Get("/api/secure", [](const httplib::Request& req, httplib::Response& res) {
res.set_content(R"({
"code":200,
"msg":"HTTPS加密通信成功",
"protocol":"SSL/TLS"
})", "application/json");
});
// HTTPS默认8443端口
svr.listen("0.0.0.0", 8443);
return 0;
}
访问地址:https://127.0.0.1:8443/api/secure
十一、高阶实战9:全局/局部中间件拦截
cpp-httplib 支持全局前置拦截、全局后置拦截,可实现接口日志打印、Token 鉴权、权限拦截、统一响应头等生产级能力。
11.1 全局拦截器(请求日志 + 统一Token鉴权)
#include "httplib.h"
#include <iostream>
int main()
{
httplib::Server svr;
// 全局前置拦截:所有请求优先执行
svr.set_pre_routing_handler([](const httplib::Request& req, httplib::Response& res) {
// 打印请求日志
std::cout << "[" << req.method << "] " << req.path << std::endl;
// 放行登录接口
if (req.path.find("/api/login") != std::string::npos)
return httplib::Server::HandlerResponse::Unhandled;
// 全局Token校验
std::string token = req.get_header_value("Authorization");
if (token != "Bearer httplib_token_666")
{
res.status = 401;
res.set_content(R"({"code":401,"msg":"未授权访问,请先登录"})", "application/json");
return httplib::Server::HandlerResponse::Handled;
}
return httplib::Server::HandlerResponse::Unhandled;
});
// 免登接口
svr.Get("/api/login", [](const httplib::Request& req, httplib::Response& res) {
res.set_content(R"({"code":200,"token":"Bearer httplib_token_666"})", "application/json");
});
// 需要鉴权的业务接口
svr.Get("/api/user/info", [](const httplib::Request& req, httplib::Response& res) {
res.set_content(R"({"code":200,"data":{"name":"admin","role":"admin"}})", "application/json");
});
svr.listen("0.0.0.0", 8080);
return 0;
}
11.2 后置拦截器(统一响应头处理)
// 所有接口响应后统一追加响应头
svr.set_post_routing_handler([](const httplib::Request& req, httplib::Response& res) {
res.set_header("Server", "cpp-httplib");
res.set_header("Author", "CSDN实战教程");
});
十二、高阶实战10:统一参数校验机制
封装通用参数校验工具类,实现非空、长度、数值范围校验,规避非法参数,适配生产项目:
#include "httplib.h"
#include <string>
// 通用参数校验工具类
class ParamCheck
{
public:
// 非空校验
static bool notEmpty(const std::string& s) { return !s.empty(); }
// 字符串长度范围校验
static bool lenRange(const std::string& s, int min, int max) { return s.size() >= min && s.size() <= max; }
// 数值范围校验
static bool numRange(int v, int min, int max) { return v >= min && v <= max; }
};
int main()
{
httplib::Server svr;
svr.Post("/api/register", [](const httplib::Request& req, httplib::Response& res) {
std::string username = req.get_param_value("username");
std::string password = req.get_param_value("password");
int age = std::stoi(req.get_param_value("age", "0"));
// 分层参数校验
if (!ParamCheck::notEmpty(username) || !ParamCheck::lenRange(username, 2, 16))
{
res.status = 400;
res.set_content(R"({"code":400,"msg":"用户名必须2-16位非空字符"})", "application/json");
return;
}
if (!ParamCheck::lenRange(password, 6, 32))
{
res.status = 400;
res.set_content(R"({"code":400,"msg":"密码长度必须6-32位"})", "application/json");
return;
}
if (!ParamCheck::numRange(age, 1, 150))
{
res.status = 400;
res.set_content(R"({"code":400,"msg":"年龄参数不合法"})", "application/json");
return;
}
// 校验通过执行业务逻辑
res.set_content(R"({"code":200,"msg":"注册成功"})", "application/json");
});
svr.listen("0.0.0.0", 8080);
return 0;
}
十三、HTTP 客户端实战(GET/POST/JSON 请求)
cpp-httplib 不仅可搭建服务端,还可作为轻量HTTP客户端,无需 curl 即可调用第三方接口:
#include "httplib.h"
#include <iostream>
int main()
{
// 创建客户端实例
httplib::Client cli("http://httpbin.org");
// 1. GET带参数请求
if (auto res = cli.Get("/get?name=httplib&age=10"))
{
if (res->status == 200)
std::cout << "GET响应:" << res->body << std::endl;
}
// 2. POST JSON请求
httplib::Headers headers = {
{"Content-Type", "application/json"}
};
std::string json_body = R"({"user":"test","pwd":"123456"})";
if (auto res = cli.Post("/post", headers, json_body, "application/json"))
{
std::cout << "POST响应:" << res->body << std::endl;
}
return 0;
}
十四、高阶实战11:WebSocket 双向长连接全功能实战
cpp-httplib 原生支持 WebSocket 协议,无需额外依赖,完全对齐 Crow/Poco 教程功能维度,覆盖基础双向通信、客户端断线重连、服务端心跳保活、全员消息广播、二进制数据传输、WSS加密长连接全生产级场景,适配实时消息、设备监控、在线聊天室等业务。
14.1 WebSocket 核心特性与场景
-
全生命周期回调:支持连接建立、消息接收、连接关闭、异常捕获
-
双数据格式:支持文本字符串、二进制字节流传输
-
高可用机制:支持心跳保活、超时断连、客户端断线重连
-
集群广播:支持单聊、全员广播、指定客户端消息推送
-
加密传输:兼容 WS 明文、WSS SSL 加密双模式
-
跨端适配:完美兼容浏览器、C++客户端、移动端 WebSocket
14.2 生产级服务端(广播+心跳+连接管理)
实现多客户端连接管理、定时心跳检测、全员消息广播、异常连接清理,可直接用于线上业务:
#include "httplib.h"
#include <iostream>
#include <string>
#include <vector>
#include <mutex>
#include <thread>
#include <chrono>
// 全局连接池:管理所有在线WebSocket客户端
std::vector<httplib::WebSocket*> g_ws_clients;
std::mutex g_ws_mutex;
// 全员广播消息
void broadcast_msg(const std::string& msg)
{
std::lock_guard<std::mutex> lock(g_ws_mutex);
for (auto ws : g_ws_clients)
{
if (ws && ws->is_open())
{
ws->send(msg);
}
}
}
// 定时心跳检测线程
void heartbeat_thread()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::seconds(10));
broadcast_msg("[心跳包] 服务端保活探测");
}
}
int main()
{
httplib::Server svr;
// 启动心跳检测线程
std::thread(heartbeat_thread).detach();
// WebSocket核心路由
svr.ws("/ws", [](httplib::WebSocket& ws) {
// 1. 连接建立回调
ws.on_open = [&]() {
std::lock_guard<std::mutex> lock(g_ws_mutex);
g_ws_clients.push_back(&ws);
std::cout << "新客户端连接成功,当前在线人数:" << g_ws_clients.size() << std::endl;
ws.send("连接成功!欢迎接入cpp-httplib WebSocket服务");
// 广播新用户上线通知
broadcast_msg("【系统通知】有新客户端上线,当前在线:" + std::to_string(g_ws_clients.size()) + "人");
};
// 2. 接收客户端消息(文本+二进制兼容)
ws.on_message = [&](const std::string& data, bool is_binary) {
if (is_binary)
{
std::cout << "收到二进制数据,长度:" << data.size() << "字节" << std::endl;
ws.send(data, true); // 二进制数据原样回显
}
else
{
std::cout << "收到文本消息:" << data << std::endl;
// 全员广播客户端消息
broadcast_msg("【客户端消息】" + data);
}
};
// 3. 连接关闭回调,清理失效连接
ws.on_close = [&](uint64_t code, const std::string& reason) {
std::lock_guard<std::mutex> lock(g_ws_mutex);
// 移除当前关闭的连接
for (auto it = g_ws_clients.begin(); it != g_ws_clients.end(); ++it)
{
if (*it == &ws)
{
g_ws_clients.erase(it);
break;
}
}
std::cout << "客户端连接断开,原因:" << reason << ",当前在线人数:" << g_ws_clients.size() << std::endl;
broadcast_msg("【系统通知】客户端下线,当前在线:" + std::to_string(g_ws_clients.size()) + "人");
};
});
std::cout << "WebSocket服务启动成功!地址:ws://127.0.0.1:8080/ws" << std::endl;
svr.listen("0.0.0.0", 8080);
return 0;
}
14.3 前端测试页面(含断线重连)
自带自动断线重连、消息打印、状态监听,完全适配生产测试场景,可直接浏览器打开使用:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>WebSocket测试客户端(带断线重连)</title>
</head>
<body>
<h3>WebSocket实时通信测试</h3>
<div id="msg_box" style="height: 300px;overflow-y: auto;border: 1px solid #ccc;padding: 10px;margin-bottom: 10px;"></div>
<input type="text" id="input_msg" placeholder="输入消息">
<button onclick="sendMsg()">发送消息</button>
<script>
let ws = null;
let reconnect_timer = null;
const ws_url = "ws://127.0.0.1:8080/ws";
// 初始化连接
function initConnect() {
ws = new WebSocket(ws_url);
// 连接成功
ws.onopen = function() {
console.log("WebSocket连接成功");
addMsg("【系统】连接服务端成功");
clearTimeout(reconnect_timer);
};
// 接收服务端消息
ws.onmessage = function(e) {
addMsg("【服务端】" + e.data);
};
// 连接关闭,自动重连
ws.onclose = function() {
addMsg("【系统】连接断开,正在重连…");
reconnect_timer = setTimeout(initConnect, 2000);
};
// 连接异常
ws.onerror = function(err) {
addMsg("【系统】连接异常:" + err);
};
}
// 发送消息
function sendMsg() {
let msg = document.getElementById("input_msg").value;
if (!msg) return;
ws.send(msg);
addMsg("【我】" + msg);
document.getElementById("input_msg").value = "";
}
// 追加消息到页面
function addMsg(text) {
let box = document.getElementById("msg_box");
let p = document.createElement("p");
p.innerText = text;
box.appendChild(p);
box.scrollTop = box.scrollHeight;
}
// 初始化连接
initConnect();
</script>
</body>
</html>
14.4 WSS 加密长连接(生产外网可用)
基于前文 SSL 证书搭建加密 WebSocket 服务,解决外网 WS 明文被拦截、篡改问题,适配正式环境部署:
#include "httplib.h"
#include <iostream>
#include <string>
#include <vector>
#include <mutex>
std::vector<httplib::WebSocket*> g_wss_clients;
std::mutex g_wss_mutex;
void wss_broadcast(const std::string& msg)
{
std::lock_guard<std::mutex> lock(g_wss_mutex);
for (auto ws : g_wss_clients)
{
if (ws && ws->is_open()) ws->send(msg);
}
}
int main()
{
// 加载证书和私钥,创建加密服务
httplib::SSLServer svr("./server.crt", "./server.key");
svr.ws("/wss", [](httplib::WebSocket& ws) {
ws.on_open = [&]() {
std::lock_guard<std::mutex> lock(g_wss_mutex);
g_wss_clients.push_back(&ws);
std::cout << "加密WSS客户端连接成功,在线数:" << g_wss_clients.size() << std::endl;
ws.send("WSS加密长连接建立成功,通信已安全加密");
};
ws.on_message = [&](const std::string& data, bool is_bin) {
std::cout << "收到加密消息:" << data << std::endl;
wss_broadcast("【加密广播】" + data);
};
ws.on_close = [&](uint64_t code, const std::string& reason) {
std::lock_guard<std::mutex> lock(g_wss_mutex);
for (auto it = g_wss_clients.begin(); it != g_wss_clients.end(); ++it)
{
if (*it == &ws) { g_wss_clients.erase(it); break; }
}
std::cout << "WSS客户端断开,在线数:" << g_wss_clients.size() << std::endl;
};
});
std::cout << "WSS加密服务启动:wss://127.0.0.1:8443/wss" << std::endl;
svr.listen("0.0.0.0", 8443);
return 0;
}
14.5 WebSocket 核心踩坑总结
-
连接失效问题:必须全局维护连接池,连接关闭后及时清理失效指针,避免野指针崩溃
-
线程安全问题:多客户端并发场景,操作连接池必须加互斥锁
-
数据格式问题:区分文本/二进制传输,文件、字节流必须使用二进制模式
-
断线重连问题:前端必须实现自动重连,服务端通过心跳检测失效连接
-
加密适配问题:外网部署必须使用 WSS,浏览器禁止明文 WS 跨域访问
十五、核心API速查表
|
GET接口注册 |
svr.Get(path, callback) |
|
POST接口注册 |
svr.Post(path, callback) |
|
获取Query参数 |
req.get_param_value(key) |
|
路由正则匹配 |
/user/(\\\\d+) |
|
静态资源托管 |
svr.set_mount_point() |
|
全局前置拦截 |
set_pre_routing_handler |
|
全局404兜底 |
set_error_handler |
|
HTTPS服务 |
SSLServer(crt, key) |
|
WebSocket长连接注册 |
svr.ws(path, callback) |
|
WebSocket消息发送 |
ws.send(data, is_binary) |
|
判断连接是否有效 |
ws.is_open() |
十六、常见问题与解决方案
16.1 Linux 编译报错 undefined reference to pthread
解决:编译追加 -pthread,CMake 引入 Threads 线程库。
16.2 HTTPS/WSS 编译报错
解决:安装 OpenSSL 开发库,编译链接 -lssl -lcrypto。
16.3 跨域请求失败
解决:必须拦截 OPTIONS 预检请求并返回 200 状态码,配置完整跨域请求头。
16.4 文件上传中文乱码
解决:文件保存时使用 ios::binary 二进制模式读写。
16.5 WebSocket连接失败/消息收不到
解决:关闭防火墙、确保端口开放;服务端必须保留ws对象生命周期,不提前销毁;客户端地址协议严格匹配 ws/wss。
16.6 WebSocket多客户端并发崩溃
解决:操作全局连接池、群发消息时必须加互斥锁,保证线程安全。
16.7 长连接超时自动断开
解决:服务端开启定时心跳包,客户端持续应答,维持连接活跃状态。
十七、总结
cpp-httplib 是目前 C++ 轻量 Web 开发全能最优解,对比 Crow、Poco、Boost.Beast,它具备:零依赖、单头文件、低学习成本、HTTP+客户端+WebSocket 三位一体能力,同时支持 SSL 加密,完美适配小型服务、嵌入式、实时通信场景,功能维度完全对齐主流C++ Web框架。
本文全覆盖零基础到生产级所有实战场景,完整对标往期 Crow/Poco 教程:
-
基础 HTTP 服务搭建、多线程高并发
-
RESTful 动态路由、GET/POST、JSON 前后端交互
-
全局跨域、404 异常兜底、静态资源托管
-
Multipart 表单批量文件上传
-
HTTPS 加密服务、WSS 加密长连接部署
-
全局中间件拦截、Token鉴权、统一响应处理
-
生产级通用参数校验机制
-
HTTP 客户端第三方接口调用
-
WebSocket 全功能实战:双向通信、广播群发、心跳保活、断线重连、二进制传输、加密长连接
所有代码开箱即用,可直接用于 C++ 后台开发、嵌入式Web服务、工具调试、实时消息推送、设备通信等场景。





