WebSocket في Node.js: مكتبة ws للوقت الفعلي

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

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

ابدأ الدورة

مكتبة ws: WebSocket لـ Node.js



مكتبة ws هي تطبيق بسيط وسريع ومختبر بالكامل لبروتوكول WebSocket لـ Node.js. وهي المعيار الفعلي لإنشاء تطبيقات الوقت الفعلي (الدردشات، الألعاب عبر الإنترنت، الإشعارات، التحرير المشترك) على جانب الخادم في JavaScript. على عكس وحدة http المدمجة، توفر ws اتصالاً ثنائي الاتجاه كاملاً بين العميل والخادم دون طلبات HTTP مستمرة.



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

  • دعم كامل للبروتوكول RFC 6455 — يعمل مع جميع المتصفحات الحديثة.
  • أداء عالٍ — استهلاك ضئيل للذاكرة وزمن وصول منخفض.
  • واجهة برمجة تطبيقات بسيطة — إنشاء خادم وعميل بأسطر قليلة من الكود.
  • دعم الامتدادات — ضغط البيانات (permessage-deflate).
  • التكامل مع خادم HTTP — يمكن مشاركة المنفذ مع Express أو أي إطار عمل آخر.
  • إعادة الاتصال التلقائي — آليات مدمجة للعميل.


التثبيت

التثبيت عبر npm:

npm install ws

بعد التثبيت، المكتبة جاهزة للاستخدام.



إنشاء خادم WebSocket

لنقم بإنشاء خادم بسيط يستقبل الاتصالات ويرسل رسالة ترحيبية:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) { console.log('عميل جديد متصل');

// إرسال رسالة إلى العميل ws.send('مرحبًا بك في خادم WebSocket!');

// معالجة الرسائل الواردة ws.on('message', function incoming(message) { console.log('تم الاستلام: %s', message); // إرسال الرد (صدى) ws.send('صدى: ' + message); });

// معالجة إغلاق الاتصال ws.on('close', function() { console.log('العميل غير متصل'); });});

console.log('خادم WebSocket قيد التشغيل على ws://localhost:8080');


إنشاء عميل WebSocket

يتصل العميل بالخادم، ويرسل رسالة، ويتلقى الرد:

const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', function open() { console.log('تم إنشاء الاتصال'); ws.send('مرحبًا أيها الخادم!');});

ws.on('message', function incoming(data) { console.log('الرد من الخادم: %s', data); ws.close();});

ws.on('close', function() { console.log('تم إغلاق الاتصال');});

ws.on('error', function error(err) { console.error('خطأ:', err.message);});


العمل مع JSON وعملاء متعددين

مثال واقعي — خادم دردشة يبث الرسائل لجميع العملاء المتصلين (broadcast):

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws, req) { console.log('عميل متصل. إجمالي العملاء:', wss.clients.size);

ws.on('message', function incoming(message) { // تحليل JSON let data; try { data = JSON.parse(message); } catch (e) { ws.send(JSON.stringify({ error: 'JSON غير صحيح' })); return; }

// البث للجميع باستثناء المرسل wss.clients.forEach(function each(client) { if (client !== ws && client.readyState === WebSocket.OPEN) { client.send(JSON.stringify({ username: data.username, text: data.text, timestamp: Date.now() })); } }); });

ws.send(JSON.stringify({ system: 'مرحبًا بك في الدردشة!' }));});

يمكن للعميل إرسال JSON:

ws.send(JSON.stringify({ username: 'أليس', text: 'مرحبًا بالجميع!' }));


التكامل مع خادم HTTP

توصيات