WebSocket 在 C++ 上的应用:高级实时应用程序

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

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

开始课程

引言:为什么 C++ 上的 WebSocket 是专业人士构建实时系统的首选

\n

在当今实时通信的世界——从交易终端到多人在线游戏——毫秒级的延迟决定一切。C++ 上的 WebSocket 能够实现解释型语言无法企及的性能。在本文中,我们将深入探讨使用 Boost.Beast 库在 C++ 中构建实时应用程序的高级技术,该库提供对协议的低级控制以及最小的开销。

\n

我们不会涉及基础知识——假设您已熟悉 C++ 网络编程和 WebSocket 基础。相反,我们将重点关注架构、扩展、错误处理和性能优化。

\n\n

使用 Boost.Beast 的异步 WebSocket 服务器架构

\n

C++ 的关键优势在于能够构建完全异步的系统,而无需线程开销。Boost.Beast 构建于 Boost.Asio 之上,为处理网络套接字提供了强大的工具集。

\n\n

服务器基本结构

\n

服务器必须能够处理数千个并发连接。为此,需要使用事件循环 (io_context) 和异步操作。让我们看一个最小但高级的实现:

\n\n
#include <boost/beast/core.hpp>\n#include <boost/beast/websocket.hpp>\n#include <boost/asio.hpp>\n#include <memory>\n#include <string>\n#include <unordered_set>\n\nnamespace beast = boost::beast;\nnamespace websocket = beast::websocket;\nnamespace net = boost::asio;\nusing tcp = net::ip::tcp;\n\nclass WebSocketSession : public std::enable_shared_from_this<WebSocketSession> {\n    websocket::stream<beast::tcp_stream> ws_;\n    beast::flat_buffer buffer_;\n\npublic:\n    explicit WebSocketSession(tcp::socket&& socket)\n        : ws_(std::move(socket)) {}\n\n    void run() {\n        // 异步握手\n        ws_.async_accept(\n            beast::bind_front_handler(\n                &WebSocketSession::on_accept,\n                shared_from_this()));\n    }\n\nprivate:\n    void on_accept(beast::error_code ec) {\n        if (ec) return;\n        do_read();\n    }\n\n    void do_read() {\n        ws_.async_read(buffer_,\n            beast::bind_front_handler(\n                &WebSocketSession::on_read,\n                shared_from_this()));\n    }\n\n    void on_read(beast::error_code ec, std::size_t bytes_transferred) {\n        if (ec == websocket::error::closed) return;\n        if (ec) return;\n\n        // 处理消息\n        std::string msg = beast::buffers_to_string(buffer_.data());\n        buffer_.consume(buffer_.size());\n\n        // 回显响应(在实际应用中为业务逻辑)\n        ws_.text(ws_.got_text());\n        ws_.async_write(net::buffer(msg),\n            beast::bind_front_handler(\n                &WebSocketSession::on_write,\n                shared_from_this()));\n    }\n\n    void on_write(beast::error_code ec, std::size_t bytes_transferred) {\n        if (ec) return;\n        do_read();\n    }\n};
\n\n

会话管理与广播

\n

对于实时聊天或监控,需要向所有连接的客户端发送消息。使用线程安全的容器:

\n\n
class WebSocketServer {\n    net::io_context& ioc_;\n    tcp::acceptor acceptor_;\n    std::unordered_set<std::shared_ptr<WebSocketSession>> sessions_;\n    std::mutex sessions_mutex_;\n\npublic:\n    WebSocketServer(net::io_context& ioc, short port)\n        : ioc_(ioc)\n        , acceptor_(ioc, tcp::endpoint(tcp::v4(), port)) {\n        do_accept();\n    }\n\n    void broadcast(const std::string& message) {\n        std::lock_guard<std::mutex> lock(sessions_mutex_);\n        for (auto& session : sessions_) {\n            session->send(message);\n        }\n                

博客

书籍推荐