C++ WebSocket库:完整概述与使用示例
WebSocket是一种基于TCP的全双工通信协议,能够在客户端和服务器之间建立持久连接。与HTTP不同,WebSocket允许双方在不重复请求的情况下发送消息,非常适合聊天、在线游戏、股票行情及其他实时应用。
C++中有多个成熟的库可用于WebSocket开发。本文将介绍三种最流行的选择:Boost.Beast、uWebSockets和libwebsockets。我们将分析它们的特点、安装方法,并提供可运行的代码示例。
1. Boost.Beast — 强大且标准化
Boost.Beast是一个基于Boost.Asio的库,实现了HTTP和WebSocket协议。它从Boost 1.66版本起成为Boost的一部分,是严肃C++项目的事实标准。
安装
# 安装Boost (Ubuntu/Debian)sudo apt install libboost-all-dev
# 或者从源码编译,使用 --with-beast 选项WebSocket服务器示例(回声服务器)
#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/ip/tcp.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 (;;) { beast::flat_buffer buffer; ws.read(buffer); std::string msg = beast::buffers_to_string(buffer.data()); std::cout << "收到: " << msg << std::endl;
ws.text(ws.got_text()); ws.write(buffer.data()); } } } catch (const std::exception& e) { std::cerr << "错误: " << e.what() << std::endl; } return 0;}WebSocket客户端示例
#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/connect.hpp>#include <iostream>
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::resolver resolver{ioc}; websocket::stream<tcp::socket> ws{ioc};
auto const results = resolver.resolve("localhost", "8080"); net::connect(ws.next_layer(), results.begin(), results.end()); ws.handshake("localhost", "/");
ws.write(net::buffer(std::string("你好,服务器!"))); beast::flat_buffer buffer; ws.read(buffer); std::cout << "响应: " << beast::buffers_to_string(buffer.data()) << std::endl;
ws.close(websocket::close_code::normal); } catch (const std::exception& e) { std::cerr << "错误: " << e.what() << std::endl; } return 0;}2. uWebSockets — 快速且轻量
uWebSockets (µWebSockets) 是一个用C++11编写的高性能库。它使用自己的事件循环,同时支持HTTP和WebSocket。其特点是内存占用极低,运行速度极快。
安装
git clone https://github.com/uNetworking/uWebSockets.gitcd uWebSocketsmakesudo make install回声服务器示例
#include <uwebsoc