WebSocket على C++: تطبيقات الوقت الفعلي المتقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا WebSocket على C++ هو اختيار المحترفين لأنظمة الوقت الفعلي

\n

في عالم اتصالات الوقت الفعلي الحديث - من محطات التداول إلى الألعاب متعددة اللاعبين - زمن الاستجابة بالميلي ثانية يحسم كل شيء. يتيح WebSocket على C++ تحقيق أداء لا يمكن للغات المفسرة الوصول إليه. في هذه المقالة، سنحلل التقنيات المتقدمة لإنشاء تطبيقات الوقت الفعلي على C++ باستخدام مكتبة Boost.Beast، التي توفر تحكمًا منخفض المستوى في البروتوكول وأقل تكاليف إضافية.

\n

لن نناقش الأساسيات - من المفترض أنك على دراية ببرمجة الشبكات على C++ وأساسيات WebSocket. بدلاً من ذلك، سنركز على البنية المعمارية، توسيع النطاق، معالجة الأخطاء، وتحسين الأداء.

\n\n

بنية خادم WebSocket غير المتزامن على C++ مع Boost.Beast

\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                

المدونات

توصيات الكتب