C++ WebSocket 库:选择与使用的完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ WebSocket 库:实时应用的现代工具



WebSocket 是一种协议,可在客户端和服务器之间通过 TCP 建立持久的双向连接。与 HTTP 不同,它无需持续请求即可实时传输数据。对于 C++ 语言,有多个强大的库实现了 WebSocket。本文将介绍最流行的三个:Boost.Beast、uWebSockets 和 websocketpp,并提供实际使用示例。



为什么需要 C++ WebSocket 库?



从头开发 WebSocket 是一项复杂的任务,需要深入理解协议、连接管理和帧处理。现成的库提供了:



  • RFC 6455 协议的完整实现
  • SSL/TLS 加密支持
  • 多连接管理
  • 分片消息处理
  • 用于连接检查的 ping/pong 机制
  • 高性能异步架构


Boost.Beast — 工业标准



Boost.Beast 是一个基于 Boost.Asio 的库。它提供了 HTTP 和 WebSocket 协议的实现。被认为是 C++ 中最可靠、最高性能的解决方案。



安装:

# 对于 Ubuntu/Debian:sudo apt install libboost-all-dev

# 或通过 vcpkg:vcpkg install boost-beast


简单的 WebSocket 服务器示例:

#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio.hpp>#include <iostream>#include <string>

namespace beast = boost::beast;namespace websocket = beast::websocket;namespace net = boost::asio;using tcp = net::ip::tcp;

int main() { try { net::io_context ioc; tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 8080));

while (true) { tcp::socket socket(ioc); acceptor.accept(socket);

websocket::stream<tcp::socket> ws(std::move(socket)); ws.accept();

for (int i = 0; i < 5; ++i) { beast::flat_buffer buffer; ws.read(buffer); std::cout << "收到: " << beast::make_printable(buffer.data()) << std::endl;

std::string response = "服务器响应: " + std::to_string(i); ws.write(net::buffer(response)); } } } catch (std::exception const& e) { std::cerr << "错误: " << e.what() << std::endl; } return 0;}


特点:

  • 与 Boost.Asio 完全集成(异步操作)
  • 开箱即用的 SSL 支持
  • 极低的抽象开销
  • 丰富的文档和示例
  • 用于生产项目(例如某些游戏服务器)


uWebSockets — 轻量且快速



uWebSockets 是一个用 C++17 编写的库,专注于最大性能和最小内存消耗。它同时支持 HTTP 和 WebSocket。



安装:

git clone https://github.com/uNetworking/uWebSockets.gitcd uWebSocketsmakesudo make install


WebSocket 服务器示例:

#include <uwebsockets/App.h>#include <iostream>

int main() { uWS::App() .ws("/*", { .open = [](auto* ws) { std::cout << "客户端已连接!" << std::endl; ws->send("欢迎!", uWS::OpCode::TEXT); }, .message = [

推荐