WebSocket API: open وmessage وclose وerror
أنشئ اتصال WebSocket، وأرسل الرسائل واستقبلها في معالج حدث message، وتعامل مع أخطاء الاتصال والإغلاق السليم
WebSocket API: open وmessage وclose وerror درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
لماذا WebSockets؟
يعتمد HTTP على نمط الطلب والاستجابة. أما التطبيقات الفورية، مثل الدردشة والألعاب متعددة اللاعبين والتحديثات المباشرة، فتحتاج إلى اتصال دائم ثنائي الاتجاه. توفّر WebSockets اتصال TCP واحدًا يظل مفتوحًا، ويسمح للطرفين بإرسال الرسائل في أي وقت.
إنشاء WebSocket
أنشئ كائن WebSocket باستخدام عنوان URL يبدأ بـ ws:// أو wss://. يتولى المتصفح عملية مصافحة الترقية.
const ws = new WebSocket('wss://api.example.com/realtime');
// Always use wss:// (secure) in productionالأحداث الأربعة
يحتوي WebSocket على أربعة أنواع من الأحداث: open (تم الاتصال)، وmessage (تم استلام البيانات)، وclose (انتهى الاتصال)، وerror (حدثت مشكلة).
ws.addEventListener('open', () => {
console.log('Connected');
ws.send(JSON.stringify({ type: 'subscribe', channel: 'updates' }));
});
ws.addEventListener('message', (event) => {
const data = JSON.parse(event.data);
console.log('Received:', data);
});
ws.addEventListener('close', (event) => {
console.log('Closed:', event.code, event.reason);
});
ws.addEventListener('error', (event) => {
console.error('Error:', event);
});إرسال الرسائل
استخدم ws.send(). إذ يقبل سلاسل نصية أو ArrayBuffers أو Blobs أو ArrayBufferView. وبالنسبة إلى البيانات المنظّمة، نفّذ JSON.stringify أولًا.
ws.send('hello');
ws.send(JSON.stringify({ type: 'chat', text: 'Hi' }));
// Binary:
const buffer = new ArrayBuffer(8);
ws.send(buffer);استلام الرسائل
افحص event.data — فنوعه يطابق نوع البيانات التي أرسلها الخادم. استخدم JSON.parse مع البيانات التي تمثّل كائنات.
ws.addEventListener('message', (event) => {
// typeof event.data: string | ArrayBuffer | Blob
if (typeof event.data === 'string') {
const msg = JSON.parse(event.data);
handleMessage(msg);
}
});حالة الاتصال (readyState)
تحقّق من ws.readyState: CONNECTING=0، وOPEN=1، وCLOSING=2، وCLOSED=3. لا ترسل أي بيانات قبل الوصول إلى OPEN.
if (ws.readyState === WebSocket.OPEN) {
ws.send(message);
} else {
console.warn('Not connected yet');
}إغلاق الاتصال بطريقة سليمة
استدعِ ws.close(code, reason). رموز الإغلاق القياسية هي: 1000 (إغلاق عادي)، و1001 (المغادرة)، و1008 (انتهاك السياسة)، و1011 (خطأ في الخادم).
ws.close(1000, 'User logged out');استراتيجية إعادة الاتصال
تنقطع اتصالات WebSockets عند تغيّر الشبكة أو إعادة تشغيل الخادم وغير ذلك. طبّق إعادة الاتصال باستخدام التراجع الأُسّي.
let reconnectDelay = 1000;
function connect() {
const ws = new WebSocket('wss://api/realtime');
ws.addEventListener('open', () => { reconnectDelay = 1000; });
ws.addEventListener('close', () => {
setTimeout(connect, reconnectDelay);
reconnectDelay = Math.min(reconnectDelay * 2, 30000);
});
return ws;
}إشارات النبض / إبقاء الاتصال حيًا
قد تنهي الخوادم الوكيلة وموازِنات التحميل اتصالات WebSockets الخاملة بعد نحو 60 ثانية. أرسل ping كل 25 إلى 30 ثانية للحفاظ على الاتصال حيًا.
let pingInterval;
ws.addEventListener('open', () => {
pingInterval = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: 'ping' }));
}
}, 25000);
});
ws.addEventListener('close', () => clearInterval(pingInterval));المصادقة
لا تدعم WebSockets الرؤوس المخصّصة. الخيارات المتاحة: 1) المصادقة باستخدام رمز في سلسلة الاستعلام (?token=jwt) ضمن عنوان WS. 2) إرسال رسالة مصادقة بعد open. 3) استخدام ملف تعريف ارتباط (يعمل تلقائيًا عند تطابق المصدر).
// Query string:
const ws = new WebSocket(`wss://api/realtime?token=${jwt}`);
// Auth message:
ws.addEventListener('open', () => {
ws.send(JSON.stringify({ type: 'auth', token: jwt }));
});React Hook لـ WebSockets
غلّف دورة حياة WS في hook مخصّص لتجنّب تسرّب الاتصالات.
function useWebSocket(url) {
const [messages, setMessages] = useState([]);
const wsRef = useRef(null);
useEffect(() => {
const ws = new WebSocket(url);
wsRef.current = ws;
ws.addEventListener('message', (e) => {
setMessages(m => [...m, JSON.parse(e.data)]);
});
return () => ws.close();
}, [url]);
return { messages, send: (msg) => wsRef.current?.send(JSON.stringify(msg)) };
}WebSocket مقابل HTTP/2 مقابل SSE
WebSocket: اتصال ثنائي الاتجاه بالكامل، إذ يمكن للطرفين الإرسال. دفع الخادم في HTTP/2: مهجور. Server-Sent Events: من الخادم إلى العميل فقط، وهو أبسط ويدعم إعادة الاتصال تلقائيًا. اختر WS عندما يحتاج العميل إلى الإرسال أيضًا، كما في الدردشة؛ واختر SSE للإشعارات أحادية الاتجاه.
تحقّق سريع
ما رمز إغلاق WebSocket القياسي للإغلاق العادي والمقصود، مثل تسجيل المستخدم للخروج؟
مراجعة: WebSocket API
يفتح new WebSocket('wss://...') الاتصال. الأحداث الأربعة هي: open وmessage وclose وerror. تقبل send() قيمة من نوع string أو ArrayBuffer أو Blob؛ استخدم JSON.stringify للكائنات. تحقّق من readyState قبل الإرسال. استخدم close(1000) للإغلاق السليم. أعد الاتصال باستخدام التراجع الأُسّي. أرسل إشارة نبض كل 25 ثانية للحفاظ على الاتصال حيًا. استخدم سلسلة الاستعلام أو رسالة مصادقة للمصادقة. غلّف ذلك في hook عند استخدام React.
الأسئلة الشائعة
هل درس «WebSocket API: open وmessage وclose وerror» مجاني؟
نعم — نص درس «WebSocket API: open وmessage وclose وerror» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «WebSocket API: open وmessage وclose وerror»؟
أنشئ اتصال WebSocket، وأرسل الرسائل واستقبلها في معالج حدث message، وتعامل مع أخطاء الاتصال والإغلاق السليم تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «WebSocket API: open وmessage وclose وerror»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- WebSocket API: open وmessage وclose وerror
- دمج Socket.io Client
- Server-Sent Events للبث أحادي الاتجاه
- أنماط واجهات المستخدم الفورية