Sobes.tech
Junior

Веб-сокетҳо чистанд?

sobes.tech AI

Ҷавоб аз AI

Websockets (Websockets) هو بروتوكول اتصال ثنائي الاتجاه عبر اتصال TCP واحد، يتيح تبادل البيانات بين المتصفح والخادم في الوقت الحقيقي.

الاختلافات الرئيسية عن الطلبات التقليدية HTTP:

  • الاتصال ثنائي الاتجاه: يمكن للخادم إرسال البيانات إلى العميل بدون طلب مسبق من العميل.
  • اتصال واحد: يتم إنشاء اتصال دائم واحد، مما يلغي تكاليف إنشاء اتصال جديد لكل تبادل بيانات (كما في HTTP).
  • تقليل التأخير: يتم قضاء وقت أقل في إنشاء الاتصال، وتبادل رؤوس البيانات ومعالجة الطلبات/الردود القصيرة.

مبدأ العمل:

  1. Handshake: يرسل المتصفح طلب HTTP خاص إلى الخادم (مع رؤوس Upgrade: websocket و Connection: Upgrade).
  2. إنشاء الاتصال: إذا كان الخادم يدعم الويب سوكيت، يرد برمز 101 Switching Protocols، ثم يتحول الاتصال إلى بروتوكول الويب سوكيت.
  3. نقل البيانات: بعد إنشاء الاتصال، يمكن للطرفين تبادل الرسائل بحرية في أي وقت.

أمثلة على الاستخدام:

  • الألعاب عبر الإنترنت
  • الدردشات والرسائل
  • التحديثات الفورية للبيانات (الأسعار، الأخبار)
  • الأدوات التعاونية

المزايا:

  • تأخير منخفض
  • استخدام فعال للموارد (قليل من الحمل الزائد)
  • الاتصال ثنائي الاتجاه في الوقت الحقيقي

العيوب:

  • يتطلب دعمًا من جانب العميل (المتصفح) وأيضًا من جانب الخادم.
  • تنفيذ أكثر تعقيدًا مقارنة بالطلبات HTTP البسيطة.

مثال على كود العميل باستخدام JavaScript:

// إنشاء ويب سوكيت
const socket = new WebSocket('wss://example.com/websocket');

// معالج لفتح الاتصال
socket.onopen = function(event) {
  console.log('تم إنشاء الاتصال');
  socket.send('مرحبًا، خادم!'); // إرسال رسالة إلى الخادم
};

// معالج لاستلام رسالة
socket.onmessage = function(event) {
  console.log('تم استلام رسالة من الخادم: ' + event.data);
};

// معالج لإغلاق الاتصال
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`تم إغلاق الاتصال بشكل نظيف، الكود=${event.code} السبب=${event.reason}`);
  } else {
    console.log('تم قطع الاتصال'); // على سبيل المثال، بسبب عطل في الشبكة
  }
};

// معالج للأخطاء
socket.onerror = function(error) {
  console.error(`خطأ في الويب سوكيت: ${error}`);
};

// إغلاق الاتصال (عند الحاجة)
// socket.close();