مكتبات WebSocket لـ Node.js: ws، Socket.IO و µWebSockets
WebSocket هو بروتوكول يوفر اتصالاً ثنائي الاتجاه مستمراً بين العميل والخادم. في نظام Node.js البيئي، توجد عدة مكتبات شائعة تنفذ هذا البروتوكول. في هذه المقالة، سنستعرض ثلاث مكتبات رئيسية: ws، Socket.IO و µWebSockets (uWS). ستتعلم كيفية تثبيتها، كتابة خادم دردشة بسيط، واختيار الأداة المناسبة لمهمتك.
1. مكتبة ws — خفيفة وعالية الأداء
ws هي مكتبة WebSocket الأكثر شيوعاً وسرعة لـ Node.js. تنفذ بروتوكول WebSocket النقي دون إضافات إضافية، مما يوفر أقل حمل وأقصى سرعة.
التثبيت
npm install wsمثال: خادم الصدى
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => { console.log('تم اتصال العميل');
ws.on('message', (message) => { console.log(`تم الاستلام: ${message}`); ws.send(`الصدى: ${message}`); });
ws.on('close', () => { console.log('تم فصل العميل'); });});
console.log('خادم WebSocket يعمل على ws://localhost:8080');الجزء العميل (المتصفح)
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => { console.log('تم إنشاء الاتصال'); socket.send('مرحباً أيها الخادم!');};
socket.onmessage = (event) => { console.log('الرد من الخادم:', event.data);};
socket.onerror = (error) => { console.error('خطأ WebSocket:', error);};ميزات ws:
- الأداء: أسرع بمقدار 2-3 مرات من Socket.IO في اختبارات الإنتاجية.
- البساطة: لا توجد آليات مدمجة لإعادة الاتصال أو الغرف أو وسائل النقل البديلة.
- الدعم: توافق كامل مع RFC 6455.
- الاستخدام: مثالي لتطبيقات الوقت الفعلي حيث السرعة حرجة (بيانات الأسهم، الألعاب، الدردشات عالية التحميل).
2. Socket.IO — الراحة والموثوقية للإنتاج
Socket.IO ليست مجرد مكتبة WebSocket، بل إطار عمل كامل لتطبيقات الوقت الفعلي. يضيف فوق WebSocket: إعادة الاتصال التلقائي، الغرف، مساحات الأسماء، التبديل إلى long-polling (إذا لم يكن WebSocket مدعوماً) وواجهة برمجة تطبيقات مريحة.
التثبيت
npm install socket.ioمثال: خادم دردشة بسيط
const http = require('http');const { Server } = require('socket.io');
const server = http.createServer();const io = new Server(server, { cors: { origin: '*' }});
io.on('connection', (socket) => { console.log(`تم اتصال المستخدم: ${socket.id}`);
socket.on('chat message', (msg) => { console.log(`الرسالة: ${msg}`); io.emit('chat message', msg); // إرسال للجميع });
socket.on('disconnect', () => { console.log(`تم فصل المستخدم: ${socket.id}`); });});
server.listen(3000, () => { console.log('خادم Socket.IO على http://localhost:3000');});الجزء العميل (المتصفح)
<script src="/socket.io/socket.io.js"></script><script> const socket = io('http://localhost:3000');
socket.on('connect', () => { console.log('تم الاتصال بالخادم'); socket.emit('chat message', 'مرحباً بالجميع!'); });
socket.on('chat message', (msg) => { const item = document.createElement('li'); item.textContent = msg; document.getElementById('messages').appendChild(item); });</script>ميزات Socket.IO:
- إعادة الاتصال التلقائي: عند انقطاع الاتصال، يحاول العميل استعادة الاتصال تلقائياً.
أيضاً في المكتبة
توصيات