前后端通信
起因是,有一次面试的时候面试官问我聊不了解前后端通信,我竟然回答了我对前端不是很了解。。。我感觉这个回答太蠢了。
前后端通信,核心是通信,也就是网络编程、协议设计、序列化这些东西和前端关系其实不大。
前后端通信
在 C++ 的语境下,“前后端通信”这个概念与 Web 开发(如 JavaScript/HTML)中的定义有显著不同。C++ 通常作为后端语言、系统级语言或客户端原生应用语言出现。
- 在 Web 全栈语境里:“前后端通信” = AJAX/Fetch + REST API + CORS + JSON,确实强绑定前端技术。
- 在 C++ / 系统开发语境里:“前后端通信” = Socket + Protobuf/gRPC + TCP/UDP + 并发模型,跟浏览器没有半毛钱关系。
因此,在 C++ 中提到的“前后端通信”,通常指代以下三种场景之一:
1. C++ 作为后端服务(最常见)
这是最标准的含义。C++ 程序运行在服务器上,作为高性能后端,与外部的前端(Web浏览器、移动端App、桌面GUI)进行数据交互。
- 通信协议:
- HTTP/RESTful API:使用库(如 Crow, Drogon, Pistache, Boost.Beast)搭建 HTTP 服务器,前端通过 JSON/Protobuf 请求数据。
- WebSocket:用于实时双向通信(如游戏、聊天室、金融行情),常用库包括 uWebSockets, websocketpp。
- gRPC / Protobuf:Google 开源的高性能 RPC 框架,C++ 是其一等公民,适合微服务间或前后端强类型通信。
- TCP/UDP Socket:底层自定义二进制协议,常见于游戏服务器、IoT 设备通信。
- 核心关注点:序列化/反序列化性能、并发模型(Reactor/Proactor)、内存零拷贝、低延迟。
2. C++ 桌面/嵌入式应用中的“进程内”前后端分离
在 Qt、Electron(C++) 或自研 GUI 框架中,C++ 同时承担前端(UI)和后端(业务逻辑)角色,但架构上做了分离。
- 含义:UI 层(View)与 业务逻辑层(Model/Controller)之间的数据绑定和消息传递。
- 通信方式:
- Qt:信号与槽(Signals & Slots)、QML 与 C++ 的属性绑定/上下文注册。
- IPC(进程间通信):如果 UI 和业务逻辑在不同进程中(为了稳定性),则通过共享内存、命名管道、本地 Socket 通信。
- WebView 桥接:C++ 宿主程序与内嵌 Web 页面之间的 JS-C++ 互调(如 CefSharp, Qt WebChannel)。
3. C++ 作为前端(WebAssembly / Wasm)
随着 Wasm 成熟,C++ 代码可以直接编译并在浏览器中运行,此时它扮演了“前端计算引擎”的角色。
- 含义:浏览器中运行的 C++ (Wasm) 模块与 JavaScript 宿主环境之间的通信。
- 通信方式:
- Emscripten Bindings:
embind或WebIDL Binder将 C++ 类/函数导出给 JS 调用。 - SharedArrayBuffer:JS 与 Wasm 之间的高效零拷贝数据共享。
- postMessage:如果 Wasm 运行在 Web Worker 中,通过消息传递与主线程通信。
- Emscripten Bindings:
核心技术栈
可以按这个框架展开(挑你擅长的说):
- 传输层:TCP 长连接 / UDP / WebSocket 的选择依据
- 协议层:自定义二进制协议 vs gRPC/Protobuf vs HTTP/JSON 的权衡
- 序列化:Protobuf / FlatBuffers 的性能优势,零拷贝设计
- 网络模型:Reactor / io_uring / 多线程并发处理
- 工程实践:粘包处理、心跳保活、断线重连、消息幂等

浙公网安备 33010602011771号