socket.emit لا يعمل بداخل socket.on

مرحبا , من جانب الخادم لدي هذه الأكواد

  socket.on("disconnect", function () {
    if (UserInfo[socket.id]) {
      socket.emit("SEND_EVENT_EMIT_SERVER", {
        cmd: "ev",
        data: 'window.onbeforeunload = null; location.href="/";'
      });
    }
  });

هذا الكود الذي في الأسفل يعمل بشكل ممتاز ومهمته هي تحديث الصفحة عند العميل

      socket.emit("SEND_EVENT_EMIT_SERVER", {
        cmd: "ev",
        data: 'window.onbeforeunload = null; location.href="/";'
      });

ولكن عندما أضعه في socket.on لا يعمل , ما هي المشكلة وهل هناك طريقة أخرى لتحديث الصفحة عند العميل ؟


التعليق السابق

بعد بحث ساعات متواصلة عثرت على المشكلة ووجدت الحل

كان علينا ان نضع كود إعادة تحميل الصفحة في مقبس مختلف من جهة الخادم على سبيل المثال

  socket.on('test', () => {
//my code
  });

وان نقوم بإستدعائها عند قطع الاتصال عبر disconnect من جهة العميل

 soket.on('disconnect', function () {
    x_x.emit('test');
  })

وسيتم تنفيذ الأكواد بنجاح

وشكرا لردك و لمساعدتك الدائمة

جيد أنك استطعت ايجاد المشكلة والحل بنفسك، وهذه هي أفضل طريقة للتعلم، توجد عدة طرق لحلّ المشكلة التي واجهتك فمثلا، يمكننا الاعتماد على مراقبة حالة الاتصال على جانب العميل واستخدام Socket.io Events بشكل فعال.

على جانب العميل نستخدم الكود التالي:

const socket = io();


// الاستماع لحدث قطع الاتصال
socket.on('disconnect', function (reason) {
  console.log('Disconnected:', reason);
  if (reason === 'io server disconnect') {
    // إذا تم فصل الاتصال من قبل الخادم، حاول إعادة الاتصال يدويًا
    socket.connect();
  }
});


// الاستماع لحدث إعادة المحاولة بعد الفشل في الاتصال
socket.on('reconnect_attempt', () => {
  console.log('Attempting to reconnect...');
});


// الاستماع لحدث الفشل في إعادة الاتصال
socket.on('reconnect_failed', () => {
  console.log('Failed to reconnect');
  window.onbeforeunload = null;
  location.href = "/";
});


// الاستماع لحدث انقطاع الاتصال بسبب فشل المحاولات
socket.on('reconnect_error', (error) => {
  console.log('Reconnect error:', error);
  window.onbeforeunload = null;
  location.href = "/";
});


// الاستماع لحدث نجاح إعادة الاتصال
socket.on('reconnect', (attemptNumber) => {
  console.log('Reconnected on attempt:', attemptNumber);
});


ومن جانب الخادم:

io.on('connection', function (socket) {
  socket.on('disconnect', function (reason) {
    if (UserInfo[socket.id]) {
      console.log(`User ${socket.id} disconnected due to ${reason}`);    }
  });
});

فمن جانب العميل، يتم الاستماع لحدث disconnect لمراقبة سبب قطع الاتصال فإذا كان سبب انقطاع الاتصال هو io server disconnect، يحاول العميل إعادة الاتصال يدويا.

ثم يتم الاستماع لكل من حدث reconnect_attempt للإبلاغ عن محاولة إعادة الاتصال، وحدث reconnect_failed للإبلاغ عن فشل جميع محاولات إعادة الاتصال، وفي هذه الحالة يتم إعادة تحميل الصفحة.

كذلك بالنسبة لحدث reconnect_error للإبلاغ عن حدوث خطأ في إعادة الاتصال، وفي هذه الحالة يتم إعادة تحميل الصفحة أيضا.

يتم الاستماع لحدث reconnect للإبلاغ عن نجاح إعادة الاتصال.

أما على جانب الخادم يتم الاستماع لحدث disconnect للإبلاغ عن سبب قطع الاتصال.

نعم هذا صحيح وفكرة جيدة يمكننا الاعتماد عليها

شكرا لك