مكتبات WebSocket في Rust: tokio-tungstenite و async-tungstenite

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

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

ابدأ الدورة

مكتبات WebSocket في Rust: tokio-tungstenite و async-tungstenite



WebSocket هو بروتوكول يوفر اتصالاً ثنائي الاتجاه بين العميل والخادم عبر اتصال TCP واحد. في نظام Rust البيئي، تُستخدم مكتبتان رئيسيتان للعمل مع WebSocket: tokio-tungstenite (غير متزامنة تعتمد على Tokio) و async-tungstenite (غير متزامنة ولكنها تدعم بيئات تشغيل مختلفة). كلاهما مبني على المكتبة منخفضة المستوى tungstenite التي تنفذ بروتوكول WebSocket نفسه.



لماذا استخدام WebSocket في Rust؟

Rust هي لغة نظامية مثالية لإنشاء تطبيقات شبكية عالية التحميل. تتيح مكتبات WebSocket في Rust ما يلي:

  • إنشاء غرف دردشة، ألعاب، أنظمة إشعارات في الوقت الفعلي
  • معالجة آلاف الاتصالات المتزامنة مع استهلاك ضئيل للذاكرة
  • استخدام أمان الذاكرة في Rust على مستوى التجميع
  • التكامل مع المكتبات غير المتزامنة الأخرى (مثل خوادم HTTP)


التثبيت والإعداد

أضف التبعية إلى ملف Cargo.toml:

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


للمكتبة async-tungstenite:

[dependencies]async-tungstenite = "0.25"async-std = "1.12"


إنشاء عميل WebSocket بلغة Rust

مثال لعميل بسيط يتصل بالخادم ويرسل رسالة:

use futures_util::{SinkExt, StreamExt};use tokio_tungstenite::{connect_async, tungstenite::Message};

#[tokio::main]async fn main() { let url = "wss://echo.websocket.org"; let (mut ws_stream, _) = connect_async(url).await.expect("خطأ في الاتصال");

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

// إرسال رسالة ws_stream.send(Message::Text("مرحباً، WebSocket!".into())).await.unwrap();

// استلام الرد if let Some(msg) = ws_stream.next().await { let msg = msg.unwrap(); if let Message::Text(text) = msg { println!("تم الاستلام: {}", text); } }

ws_stream.close(None).await.unwrap();}


إنشاء خادم WebSocket بلغة Rust

خادم يستقبل الاتصالات ويرد عليها:

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

#[tokio::main]async fn main() { let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap(); println!("الخادم يعمل على ws://127.0.0.1:8080");

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

let ws_stream = accept_async(stream).await.unwrap(); let (mut sender, mut receiver) = ws_stream.split();

while let Some(msg) = receiver.next().await { match msg { Ok(Message::Text(text)) => { println!("رسالة من {}: {}", addr, text); sender.send(Message::Text(format!("صدى: {}", text))).await.unwrap(); } Ok(Message::Close(_)) => break, _ => {} } }

println!("تم إغلاق الاتصال مع {}", addr); }); }}


الميزات الرئيسية للمكتبات

  • دعم TLS/SSL — اتصالات آمنة عبر WSS (يتطلب تفعيل الميزة tls)
  • إعادة الاتصال التلقائي — يمكن تنفيذه باستخدام الحلقات والمؤقتات
  • إطارات Ping/Pong — للحفاظ على الاتصال
  • الرسائل الثنائية — العمل مع Message::Binary

توصيات