دمج Socket.io Client
صِل Socket.io client، واستمع إلى الأحداث المسماة، وأرسل البيانات إلى الخادم، وتعامل مع منطق إعادة الاتصال، وأدر الغرف من جهة العميل
دمج Socket.io Client درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ما الذي تضيفه Socket.io إلى WebSocket الخام؟
Socket.io مكتبة شائعة مبنية فوق WebSocket. وتضيف: إعادة الاتصال تلقائيًا، والرجوع إلى الاستطلاع الطويل، والغرف ومساحات الأسماء، وعمليات استدعاء الإقرار، والأحداث المسماة. وهي تستخدم مكتبة للعميل وأخرى للخادم (Node.js).
تثبيت العميل
ثبّت socket.io-client. ويجب أن يتطابق إصدارها الرئيسي مع الإصدار الرئيسي للخادم.
npm install socket.io-clientالاتصال
استورد io واتصل بعنوان URL الخاص بالخادم. يعيد ذلك مثيلًا من Socket.
import { io } from 'socket.io-client';
const socket = io('https://api.example.com', {
transports: ['websocket'], // skip polling fallback for speed
auth: { token: localStorage.getItem('jwt') }
});
socket.on('connect', () => console.log('connected', socket.id));إصدار الأحداث
ترسل socket.emit(eventName, payload) حدثًا مسمى مع بيانات — وهذا أنظف بكثير من استخدام send الخام ثم JSON.parse.
socket.emit('chat-message', {
room: 'general',
text: 'Hello everyone!'
});
socket.emit('typing', { user: 'Alice' });الاستماع إلى الأحداث
تسجّل socket.on(eventName, handler) مستمعًا. تصل الأحداث التي يصدرها الخادم إلى هنا.
socket.on('chat-message', (msg) => {
console.log(`${msg.user}: ${msg.text}`);
appendMessage(msg);
});
socket.on('user-joined', (user) => {
console.log(`${user.name} joined`);
});عمليات الإقرار (عمليات الاستدعاء Ack)
مرّر دالة استدعاء كوسيط أخير إلى emit — إذ يمكن للخادم استدعاؤها مع إرسال استجابة. وهذا يشبه RPC.
socket.emit('create-post', { title: 'Hello' }, (response) => {
if (response.error) {
console.error(response.error);
} else {
console.log('Created post', response.id);
}
});emitWithAck المعتمد على Promise
يتيح Socket.io الحديث emitWithAck، الذي يعيد promise.
try {
const response = await socket.emitWithAck('create-post', { title: 'Hello' });
console.log('Created', response.id);
} catch (err) {
console.error('Failed', err);
}الغرف
الغرف هي مجموعات من المقابس يديرها الخادم. وينضم العميل إليها أو يغادرها عبر إصدار الأحداث؛ بينما يستخدم الخادم io.to(room).emit() للبث.
// Client:
socket.emit('join-room', { roomId: 'general' });
// Listen to messages in any room you've joined:
socket.on('room-message', ({ room, message }) => {
if (room === activeRoom) appendMessage(message);
});
// Leave:
socket.emit('leave-room', { roomId: 'general' });مساحات الأسماء
مساحات الأسماء هي قنوات اتصال منفصلة على الخادم نفسه، مثل /chat و/admin. اتصل بمساحة أسماء عبر إضافة لاحقتها إلى عنوان URL.
const chatSocket = io('https://api/chat');
const adminSocket = io('https://api/admin');إعادة الاتصال مضمّنة
يعيد Socket.io الاتصال تلقائيًا باستخدام التراجع الأُسّي. ويمكن ضبط ذلك عبر الخيارات.
const socket = io({
reconnection: true,
reconnectionAttempts: Infinity,
reconnectionDelay: 1000,
reconnectionDelayMax: 30000,
randomizationFactor: 0.5
});
socket.on('reconnect', (attempt) => console.log('reconnected after', attempt));
socket.on('reconnect_attempt', (attempt) => console.log('trying...', attempt));التعامل مع قطع الاتصال
استمع إلى disconnect لتحديث واجهة المستخدم، مثل عرض شريط يشير إلى إعادة الاتصال.
socket.on('disconnect', (reason) => {
console.log('Disconnected:', reason);
if (reason === 'io server disconnect') {
// Server kicked us — must reconnect manually
socket.connect();
}
});التكامل مع React
غلّف دورة حياة socket في hook مخصّص أو موفّر Context.
// useSocket.ts
import { useEffect, useState } from 'react';
import { io, Socket } from 'socket.io-client';
let socket: Socket;
export function useSocket() {
const [connected, setConnected] = useState(false);
useEffect(() => {
if (!socket) socket = io('/');
socket.on('connect', () => setConnected(true));
socket.on('disconnect', () => setConnected(false));
return () => { /* keep socket alive across remounts */ };
}, []);
return { socket, connected };
}متى تستخدم Socket.io بدلًا من WebSocket الخام؟
استخدم Socket.io عندما تريد الغرف وعمليات استدعاء الإقرار وإعادة الاتصال التلقائية والرجوع إلى وسائل نقل بديلة جاهزة. واستخدم WebSocket الخام عندما تحتاج إلى التحكم المباشر في البروتوكول، أو إلى حجم حزمة صغير، أو إلى التشغيل البيني مع خادم لا يستخدم Socket.io.
تحقّق سريع
ما الذي يتيحه callback في الوسيط الثالث للدالة emit(event, payload, callback) في Socket.io؟
مراجعة: عميل Socket.io
مكتبة مبنية فوق WebSocket، وتوفّر الغرف ومساحات الأسماء وعمليات الإقرار وإعادة الاتصال التلقائية والرجوع إلى الاستطلاع. تنشئ io(url, options) الاتصال. ترسل emit(event, payload) أحداثًا مسماة، بينما يستمع on(event, handler) إليها. استخدم callback في الوسيط الثالث أو emitWithAck لتنفيذ RPC بأسلوب الاستدعاء عن بُعد. تُدار الغرف عبر الخادم، وتُحدَّد مساحات الأسماء بإضافة لاحقتها إلى عنوان URL. إعادة الاتصال مضمّنة. غلّف دورة الحياة في React hook.
الأسئلة الشائعة
هل درس «دمج Socket.io Client» مجاني؟
نعم — نص درس «دمج Socket.io Client» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «دمج Socket.io Client»؟
صِل Socket.io client، واستمع إلى الأحداث المسماة، وأرسل البيانات إلى الخادم، وتعامل مع منطق إعادة الاتصال، وأدر الغرف من جهة العميل تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «دمج Socket.io Client»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- WebSocket API: open وmessage وclose وerror
- دمج Socket.io Client
- Server-Sent Events للبث أحادي الاتجاه
- أنماط واجهات المستخدم الفورية