C++中的WebSocket:库与实际应用

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

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

开始课程

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                    

推荐