Socket.io لجافا سكريبت (Node.js): دليل كامل مع أمثلة

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

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

ابدأ الدورة

ما هو Socket.io ولماذا نحتاجه؟

\n\n

Socket.io هي مكتبة جافا سكريبت قوية توفر اتصالاً ثنائي الاتجاه في الوقت الفعلي (real-time) بين العميل (المتصفح) والخادم (Node.js). على عكس بروتوكول HTTP التقليدي، حيث يرسل العميل طلبًا وينتظر الرد، يسمح Socket.io للخادم ببدء إرسال البيانات إلى العميل في أي لحظة، والعكس صحيح.

\n\n

لماذا نحتاج هذا؟ تخيل تطبيق محادثة، لعبة عبر الإنترنت، لوحة تحكم برسوم بيانية حية، أو نظام تحرير مستندات مشترك. في كل هذه السيناريوهات، يجب تحديث البيانات فورًا دون إعادة تحميل الصفحة. HTTP غير مناسب لهذا لأنه يعمل وفق مبدأ "طلب-استجابة". يحل Socket.io هذه المشكلة عن طريق إنشاء اتصال دائم (عادةً عبر WebSocket) يمكن من خلاله نقل البيانات في كلا الاتجاهين في أي لحظة.

\n\n

الميزات الرئيسية لـ Socket.io:

\n
    \n
  • ثنائية الاتجاه: يمكن للخادم والعميل إرسال الرسائل لبعضهما البعض.
  • \n
  • الوقت الفعلي: يتم تسليم الرسائل فورًا (بأقل تأخير).
  • \n
  • إعادة الاتصال التلقائي: إذا انقطع الاتصال، يحاول Socket.io استعادته تلقائيًا.
  • \n
  • الغرف (Rooms): إمكانية تجميع العملاء وإرسال الرسائل إلى مجموعة معينة فقط.
  • \n
  • مساحات الأسماء (Namespaces): تقسيم التطبيق إلى قنوات اتصال مستقلة.
  • \n
  • الموثوقية: إذا لم يكن WebSocket مدعومًا، يتحول Socket.io تلقائيًا إلى طرق أخرى (long-polling، FlashSocket، إلخ).
  • \n
\n\n

تثبيت Socket.io

\n\n

يتكون Socket.io من جزأين: جزء الخادم (لـ Node.js) وجزء العميل (للمتصفح). يتم تثبيت كليهما عبر npm.

\n\n

تثبيت جزء الخادم

\n

افتح الطرفية في مجلد مشروعك ونفذ الأمر التالي:

\n
npm install socket.io
\n\n

تثبيت جزء العميل

\n

يمكن ربط سكريبت العميل بطريقتين:

\n

1. عبر CDN (الأسهل للبدء):

\n
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
\n

2. عبر npm (للمشاريع التي تستخدم أدوات التجميع مثل Webpack):

\n
npm install socket.io-client
\n\n

بداية سريعة: أول محادثة

\n\n

لننشئ محادثة بسيطة حيث يرى جميع العملاء الرسائل المرسلة من عميل واحد.

\n\n

الخطوة 1: الخادم (ملف server.js)

\n
// server.js\nconst http = require('http');\nconst { Server } = require("socket.io");\n\n// 1. إنشاء خادم HTTP\nconst server = http.createServer((req, res) => {\n    res.writeHead(200, { 'Content-Type': 'text/plain' });\n    res.end('خادم Socket.io قيد التشغيل');\n});\n\n// 2. إنشاء مثيل Socket.io مرتبط بالخادم\nconst io = new Server(server);\n\n// 3. معالج اتصال عميل جديد\nio.on('connection', (socket) => {\n    console.log('مستخدم جديد متصل:', socket.id);\n\n    // 4. الاستماع لحدث 'chat message' من العميل\n    socket.on('chat message', (msg) => {\n        console.log('الرسالة:', msg);\n        // 5. إرسال الرسالة إلى جميع العملاء المتصلين (بما فيهم المرسل)\n        io.emit('chat message', msg);\n    });\n\n    // 6. معالج فصل العميل\n    socket.on('disconnect', () => {\n        console.log('مستخدم مفصول:', socket.id);\n    });\n});\n\n// 7. تشغيل الخادم على المنفذ 3000\nserver.listen(3000, () => {\n    console.log('الخادم قيد التشغيل على http://localhost:3000');\n});\n
\n\n

الخطوة 2: العميل (ملف index.html)

\n
<!DOCTYPE html>\n<html>\n<head>\n    <title>محادثة Socket.io</title>\n    <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>                    

توصيات