WebSocket على Rust: بناء تطبيقات الوقت الفعلي

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

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

ابدأ الدورة

مقدمة إلى WebSocket باستخدام Rust



أصبحت التطبيقات في الوقت الفعلي (Real-time) جزءًا لا يتجزأ من الويب الحديث. أنظمة الدردشة، الألعاب عبر الإنترنت، أسعار الأسهم، والإشعارات في الوقت الفعلي — كل هذا يتطلب تبادلًا ثنائيًا مستمرًا للبيانات بين العميل والخادم. يوفر بروتوكول WebSocket هذه الإمكانية، وRust بفضل أدائها وأمانها هي اللغة المثالية لبناء مثل هذه الأنظمة.



في هذه المقالة، سنشرح بالتفصيل كيفية بناء تطبيقات الوقت الفعلي (Real-time) باستخدام Rust وWebSocket. ستتعرف على الكريتات (crates) الشائعة، الأساليب المعمارية، وستحصل على أمثلة جاهزة للكود للبدء السريع.



أساسيات WebSocket واختيار المكتبات



WebSocket هو بروتوكول يوفر اتصالًا كامل الازدواج (Full-duplex) عبر اتصال TCP واحد. على عكس HTTP، حيث يبدأ العميل الطلب ويستجيب الخادم، يسمح WebSocket لكلا الطرفين بإرسال البيانات في أي وقت.



الكريتات (crates) الشائعة لـ WebSocket في Rust



  • tokio-tungstenite — عميل وخادم WebSocket غير متزامن (Async) يعتمد على Tokio. خفيف وسريع.
  • actix-web — إطار ويب قوي مع دعم مدمج لـ WebSocket.
  • tungstenite — النسخة المتزامنة (Sync)، مناسبة للسيناريوهات البسيطة.
  • warp — إطار عمل غير متزامن آخر مع دعم WebSocket.


لمعظم المشاريع، نوصي باستخدام tokio-tungstenite أو actix-web. الأول للخوادم والعملاء الخفيفة، والثاني لتطبيقات الويب الكاملة.



إنشاء خادم WebSocket باستخدام Rust



لننظر في إنشاء خادم echo بسيط، يستقبل الرسائل ويرسلها مرة أخرى إلى العميل. سنستخدم tokio-tungstenite.



إعداد المشروع



أنشئ مشروع Cargo جديد وأضف التبعيات في Cargo.toml:



[dependencies]tokio = { version = "1", features = ["full"] }tokio-tungstenite = "0.21"futures-util = "0.3"


خادم echo أساسي



use futures_util::{SinkExt, StreamExt};use tokio::net::TcpListener;use tokio_tungstenite::accept_async;

#[tokio::main]async fn main() -> Result<(), Box> { let listener = TcpListener::bind("127.0.0.1:8080").await?; println!("الخادم قيد التشغيل على ws://127.0.0.1:8080");

while let Ok((stream, addr)) = listener.accept().await { println!("اتصال جديد: {}", addr); tokio::spawn(handle_connection(stream)); }

Ok(())}

async fn handle_connection(stream: tokio::net::TcpStream) { let ws_stream = accept_async(stream).await.unwrap(); let (mut write, mut read) = ws_stream.split();

while let Some(msg) = read.next().await { let msg = msg.unwrap(); // إعادة إرسال الرسالة مرة أخرى write.send(msg).await.unwrap(); }}


يقوم هذا الكود بإنشاء خادم TCP على المنفذ 8080، ويقبل اتصالات WebSocket، ويقوم لكل عميل بتشغيل مهمة غير متزامنة تعيد إرسال (echo) جميع الرسائل الواردة.



إنشاء عميل WebSocket باستخدام Rust



الآن سنكتب عميلًا يتصل بخادمنا، ويرسل رسالة، ويستقبل الرد.



use futures_util::StreamExt;use tokio_tungstenite::connect_async;

#[tokio::main]async fn main() -> Result<(), Box> { let url = "ws://127.0.0.1:8080"; let (ws_stream, _) = connect_async(url).await?;

println!("تم الاتصال بالخادم");

let (mut write, mut read) = ws_stream.split();

// إرسال رسالة write.send("مرحبًا، WebSocket!".into()).await?;

// استقبال الرد if let Some(msg) = read.next().await { let msg = msg?; println!("تم الاستلام: {}", msg.to_text().unwrap()); }

Ok(())}


دردشة في الوقت الفعلي باستخدام actix-web



الآن س

المدونات

توصيات الكتب