WebSocket في C++: تطبيقات الوقت الفعلي من الألف إلى الياء
في عالم تكنولوجيا الويب الحديث، يتوقع المستخدمون استجابة فورية من التطبيقات. بروتوكول HTTP التقليدي، الذي يعمل بنمط "طلب-استجابة"، غير مناسب للمهام التي تتطلب تحديثًا مستمرًا للبيانات: الدردشات عبر الإنترنت، أسعار البورصة، الألعاب متعددة اللاعبين، وأنظمة المراقبة. هنا يأتي دور WebSocket - البروتوكول الذي يوفر اتصالًا ثنائي الاتجاه دائمًا بين العميل والخادم.
في هذه المقالة، سنشرح كيفية إنشاء تطبيقات الوقت الفعلي بلغة C++ باستخدام WebSocket. ستتعرف على المكتبات والبنية وستكتب أول كود عملي لك.
ما هو WebSocket ولماذا هو مطلوب في C++؟
WebSocket هو بروتوكول ينشئ اتصال TCP دائمًا بين العميل والخادم. بعد المصافحة (handshake)، يمكن نقل البيانات في كلا الاتجاهين دون الحاجة إلى طلبات HTTP متكررة. هذا يقلل بشكل كبير من زمن الاستجابة وعبء الشبكة.
C++ هي اللغة المثالية لأنظمة الوقت الفعلي عالية الأداء. فهي تمنحك تحكمًا كاملاً في الذاكرة والخيوط والعمليات الشبكية. وبالاقتران مع WebSocket، تحصل على:
- أقل زمن استجابة - يتم تسليم البيانات في غضون أجزاء من الثانية.
- إنتاجية عالية - آلاف الاتصالات المتزامنة.
- كفاءة في استهلاك الطاقة - استهلاك منخفض لموارد الخادم.
أمثلة على الاستخدام: محطات التداول، الألعاب عبر الإنترنت (مثل الشطرنج في الوقت الفعلي)، أنظمة الإشعارات، أجهزة إنترنت الأشياء، وحتى بث البيانات من أجهزة الاستشعار.
اختيار المكتبة: Boost.Beast مقابل uWebSockets
هناك عدة مكتبات شائعة للعمل مع WebSocket بلغة C++. سننظر في اثنتين رئيسيتين:
Boost.Beast
هذا جزء من نظام Boost البيئي، مكتوب بلغة C++ الحديثة 11/14/17. يوفر Beast تحكمًا منخفض المستوى في WebSocket وHTTP. وهو غير متزامن، مبني على Boost.Asio، ومثالي للمشاريع الجادة.
uWebSockets (µWebSockets)
مكتبة خفيفة الوزن وفائقة السرعة. مكتوبة بلغة C++17، وتركز على أقصى أداء. مثالية للخدمات المصغرة وتطبيقات الوقت الفعلي البسيطة.
سنختار Boost.Beast لهذا الدليل، لأنه أكثر مرونة وأفضل توثيقًا للأغراض التعليمية.
كتابة خادم WebSocket بلغة C++ باستخدام Boost.Beast
لنقم بإنشاء خادم صدى بسيط يستقبل الرسائل من العميل ويعيد إرسالها. هذا هو الأساس لأي تطبيق وقت فعلي.
أولاً، قم بتثبيت Boost.Beast وAsio. في معظم توزيعات Linux، يتم ذلك عبر مدير الحزم:
sudo apt install libboost-all-devالآن كود الخادم:
#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/ip/tcp.hpp>#include <iostream>#include <string>#include <thread>
namespace beast = boost::beast;namespace websocket = beast::websocket;namespace net = boost::asio;using tcp = net::ip::tcp;
void do_session(tcp::socket&& socket) { try { websocket::stream<tcp::socket> ws{std::move(socket)}; ws.accept();
for (;;) { beast::flat_buffer buffer; ws.read(buffer); auto msg = beast::buffers_to_string(buffer.data()); std::cout << "Received: " << msg << std::endl;
// إجابة الصدى ws.text(ws.got_text()); ws.write(buffer.data()); } } catch (beast::system_error const& se) { if (se.code() != websocket::error::closed) { std::cerr << "Error: " << se.code().message() << std::endl; } }}
int main() { try {