مكتبات WebSocket لـ Node.js: ws و Socket.IO و uWebSockets.js

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

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

ابدأ الدورة

مكتبات WebSocket لـ Node.js: من دردشة بسيطة إلى أنظمة الوقت الفعلي عالية التحميل



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



في هذه المقالة، سنستعرض ثلاث مكتبات رئيسية: ws (خفيفة وسريعة)، Socket.IO (مريحة مع آليات احتياطية)، و uWebSockets.js (أداء قياسي). ستتعرف على أي منها تختار لمهمتك وكيفية كتابة دردشة بسيطة باستخدام كل منها.



1. مكتبة ws — البساطة والسرعة



ws هي مكتبة WebSocket الأكثر شيوعاً لـ Node.js. تنفذ بروتوكول RFC 6455 النقي دون إضافات غير ضرورية. المزايا الرئيسية:

  • أداء أقصى — يصل إلى 200,000+ رسالة/ثانية على نواة واحدة.
  • بدون تبعيات — فقط جافا سكريبت نقي.
  • تحكم كامل في الاتصال: المصافحة، الإطارات، ping/pong.
  • دعم Buffer و Streams في Node.js للبيانات الثنائية.


العيوب: لا يوجد إعادة اتصال تلقائي، لا غرف (rooms)، لا احتياطي لـ HTTP long-polling. كل شيء يحتاج إلى تنفيذ يدوي أو عبر حزم إضافية.



مثال: خادم صدى بسيط باستخدام 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.toString()); // إرسال الرد (صدى) ws.send(`صدى: ${message}`); });

ws.on('close', () => { console.log('تم فصل العميل'); });

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

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


متى تختار ws؟ — للخدمات المصغرة، الألعاب عالية التحميل (حيث كل إطار مهم)، للتضمين في خادم HTTP الخاص بك (عبر server.on('upgrade')).



2. Socket.IO — الراحة والموثوقية للإنتاج



Socket.IO ليست مجرد WebSocket، بل منصة وقت فعلي كاملة. تستخدم WebSocket كوسيلة نقل أساسية، لكنها تتحول تلقائياً إلى HTTP long-polling إذا لم يكن WebSocket مدعوماً (بروكسي، جدران نارية، متصفحات قديمة).



  • الغرف (Rooms) — تجميع العملاء للإرسال الجماعي.
  • مساحات الأسماء (Namespaces) — تقسيم منطقي للتطبيق (مثل /chat و /game).
  • إعادة اتصال تلقائي مع تأخير أسي.
  • دعم الأحداث — تعمل مع الأحداث بدلاً من الرسائل الخام.
  • تسلسل مدمج — نقل كائنات JSON دون تحليل يدوي.


العيوب: تكاليف إضافية للبروتوكول (حزم إضافية مع بيانات وصفية)، تبعيات أكثر، أبطأ قليلاً من ws النقي.



مثال: دردشة مع غرف باستخدام 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('join_room', (roomName) => { socket.join(roomName); socket.emit('message', `لقد انضممت إلى الغرفة ${roomName}`); socket.to(roomName).emit('message', `المستخدم ${socket.id} دخل الغرفة`); });

// إرسال رسالة إلى الغرفة

توصيات