前后端通信

起因是,有一次面试的时候面试官问我聊不了解前后端通信,我竟然回答了我对前端不是很了解。。。我感觉这个回答太蠢了。

前后端通信,核心是通信,也就是网络编程、协议设计、序列化这些东西和前端关系其实不大。

前后端通信

在 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 BindingsembindWebIDL Binder 将 C++ 类/函数导出给 JS 调用。
    • SharedArrayBuffer:JS 与 Wasm 之间的高效零拷贝数据共享。
    • postMessage:如果 Wasm 运行在 Web Worker 中,通过消息传递与主线程通信。

核心技术栈

可以按这个框架展开(挑你擅长的说):

  1. 传输层:TCP 长连接 / UDP / WebSocket 的选择依据
  2. 协议层:自定义二进制协议 vs gRPC/Protobuf vs HTTP/JSON 的权衡
  3. 序列化:Protobuf / FlatBuffers 的性能优势,零拷贝设计
  4. 网络模型:Reactor / io_uring / 多线程并发处理
  5. 工程实践:粘包处理、心跳保活、断线重连、消息幂等
posted @ 2026-09-16 11:20  光風霽月  阅读(10)  评论(0)    收藏  举报