مكتبة 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
أيضاً في المكتبة
قوائم المهام في Swift: GCD وOperationQueue وCombine لنظامي iOS/macOS
قوائم المهام في Java: من ThreadPoolExecutor إلى Disruptor
دليل Chai الكامل لـ JavaScript (Node.js): أمثلة وطرق الاستخدام
عميل Redis للغة Go (Golang): go-redis و redigo — دليل شامل