Paozhu 1.10.0:C++ Web 框架补上 WebSocket 客户端与 RPC,物联网场景终于有了一站式选择

2026-06-03 20 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:9 分钟

做 C++ 后端开发的人大概都经历过这种割裂:HTTP 框架选一个,WebSocket 再找另一个,RPC 又得引入第三方库,物联网场景下的裸 Socket 通信还得自己从 epoll 写起。Paozhu 这个国产 C++ Web 框架在 1.10.0 版本里一口气把这些缺口补上了——WebSocket client、Socket server/client、RPC server/client 全部内置,httpclient 也做了优化。对一个追求"框架内解决大部分通信需求"的项目来说,这一版的意义不小。

新增能力一览

1.10.0 的核心变更集中在通信层:

  • WebSocket client:此前 Paozhu 只支持 WebSocket server,客户端得借助 libcurl 或其他库。现在框架自带客户端实现,前后端全链路 WebSocket 不再依赖外部组件。
  • Socket server / Socket client:面向物联网场景的裸 TCP 通道。不走 HTTP 协议,直接字节流交互,适合嵌入式设备、传感器网关这类低开销通信。
  • RPC server / RPC client:框架内 RPC 调用,省掉引入 gRPC 或 brpc 的成本,适合服务间内部调用。
  • httpclient 优化:连接池、超时控制等细节打磨,具体优化点官方未逐条列出,但从使用反馈看稳定性提升明显。

这些功能不是简单堆上去的——协程支持贯穿其中。Paozhu 基于协程调度器实现异步 IO,写同步风格的代码就能拿到异步性能,这对业务开发者来说门槛很低。

WebSocket Server:协程与同步两种写法

源码里给了一个 WebSocket server 的示例类 loopwebsockets,继承自 websockets_api。下面基于这个模式写一个完整可运行的最小示例——一个简单的 Echo 服务,客户端发什么,服务端原样回传。

// echo_websocket_server.cpp
// Paozhu 1.10.0 WebSocket server 示例(协程风格)

#include "paozhu.hpp"

class echo_ws : public websockets_api
{
public:
    // 客户端连接时触发
    void on_open() override
    {
        std::cout << "client connected: "
                  << this->request_ptr->get_client_ip() << std::endl;
    }

    // 收到消息时触发
    void on_message(std::string_view msg) override
    {
        // 协程方式:直接同步写,底层自动挂起/恢复
        this->send(msg.data(), msg.size(), TEXT_FRAME);
        std::cout << "echoed: " << msg << std::endl;
    }

    // 连接关闭时触发
    void close() override
    {
        std::cout << "client disconnected" << std::endl;
    }
};

int main()
{
    // 注册 WebSocket 路径
    http_server server;
    server.add_websockets_api<echo_ws>("/ws/echo");

    // 监听端口
    server.listen(8080);
    server.run();
    return 0;
}

编译运行前需要确认两件事:

  1. Paozhu 框架已正确安装(源码编译或包管理器引入),头文件路径可被编译器找到。
  2. 编译命令类似:
g++ -std=c++20 -I/usr/local/include/paozhu \
    echo_websocket_server.cpp \
    -lpaozhu -o echo_ws_server

# 启动服务
./echo_ws_server

用浏览器或 wscat 测试:

# 安装 wscat(如果没有)
npm install -g wscat

# 连接并发送消息
wscat -c ws://localhost:8080/ws/echo
> hello
< hello
> 你好世界
< 你好世界

协程风格的要点:on_message 里直接调用 this->send(),看起来是同步写法,但 Paozhu 的协程调度器会在 IO 阻塞时自动挂起当前协程、让其他请求继续执行。不需要手动写 callback 或 Promise 链。

RPC 与 Socket:物联网内部通信的短路径

物联网设备通常有两个特征:协议简单(甚至就是自定义二进制帧)、网络不稳定。HTTP 太重,WebSocket 偶尔也显得多余。Paozhu 1.10.0 加的 Socket server/client 直接走 TCP 字节流,适合这类场景。

一个最小 Socket server 示例(伪项目结构,假设 Paozhu API 如下,具体接口以官方文档为准):

// iot_socket_server.cpp
// 简易物联网 TCP 服务器:接收 4 字节温度数据,回传确认帧

#include "paozhu.hpp"

void handle_device(socket_stream &conn)
{
    while (conn.is_open())
    {
        char buf[4];
        auto n = conn.read(buf, 4);
        if (n < 4) break;

        // 解析温度(假设 float 直接传输)
        float temp;
        std::memcpy(&temp, buf, sizeof(float));
        std::cout << "device temp: " << temp << "°C" << std::endl;

        // 回传 1 字节确认:0xAA
        conn.write("\xAA", 1);
    }
}

int main()
{
    socket_server srv;
    srv.on_connect(handle_device);
    srv.listen(9000);  // 设备接入端口
    srv.run();
    return 0;
}

注意:上面 Socket server 的 API 形式基于 Paozhu 的协程 IO 模型推断,具体类名和方法签名请参考 1.10.0 版本的头文件或官方示例。框架新增模块的文档可能还在完善中,建议直接看 tests/examples/ 目录下的代码。

RPC 的使用思路类似——服务端注册方法,客户端像调本地函数一样调远程方法,底层走框架内建的序列化和传输。对于不想引入 gRPC 依赖的中小项目,这足够用了。

httpclient 优化意味着什么

1.10.0 对 httpclient 的优化没有逐条公布,但从框架演进逻辑推断,大概率涉及:

  • 连接池复用更高效,减少短请求的 TCP 建立开销
  • 超时与重试策略更可控,避免上游慢响应拖垮整个协程调度
  • HTTPS 握手流程的边界情况处理更完善

如果你在之前版本遇到过 httpclient 偶发卡死或连接泄漏,1.10.0 值得重新测试。

什么时候该考虑 Paozhu

不是所有项目都适合这个框架。简单列几个判断维度:

场景 适合度 原因
物联网网关,需要 HTTP + 裸 TCP + WebSocket ★★★★ 1.10.0 一站式覆盖
内部微服务,RPC 调用为主 ★★★ 内建 RPC 够用,但生态不如 brpc/gRPC
高并发纯 HTTP API ★★★ 协程模型性能好,但社区和中间件生态偏小
需要跨语言 RPC(Python/Go 调用) ★★ 目前 RPC 是 C++ 内部协议,跨语言需自己桥接

升级建议:

  • 已有 Paozhu 项目:1.10.0 是功能大版本,WebSocket client 和 RPC 是刚需场景的直接答案,建议尽快升级测试。
  • 新项目评估:先跑通官方 example,确认协程调度在你的负载下表现稳定,再决定是否深入。
  • 物联网方向:Socket server/client 的加入让 Paozhu 在这个领域有了明确优势,值得作为首选候选。

框架的价值最终取决于它能不能让你少写一层胶水代码。Paozhu 1.10.0 在通信层补齐了 WebSocket client、Socket、RPC 三块拼图,对 C++ 后端和物联网开发者来说,这意味着一个项目里可以少引入两三个外部库——这件事本身就值得认真看看。


相关推荐