Socket.io: الانبعاث إلى الاتصالات القديمة عند تحديث المتصفح والاحتفاظ بالاتصالات القديمة

تم إنشاؤها على ١ فبراير ٢٠١٦  ·  4تعليقات  ·  مصدر: socketio/socket.io

مرحبا،

لدي إعداد اختبار خادم socket.io بسيط يرسل التاريخ الحالي () إلى عميل واحد.

كل ثانية يرسل الخادم (يصدر) التاريخ () إلى عميل واحد.

إذا قمت بتحديث نافذة المتصفح ، فلا يزال لدي اتصال واحد ولكن الخادم يرسل إلى اتصالين .

إذا قمت بتحديث نافذة المتصفح ، فلا يزال لدي اتصال واحد ولكن الخادم يرسل إلى ثلاثة اتصالات.

إذا قمت بتحديث نافذة المتصفح ، فلا يزال لدي اتصال واحد ولكن الخادم يرسل إلى أربعة اتصالات.

وهلم جرا وهلم جرا...

حتى بعد عدة ساعات ، لا يزال يتم إرسال العملاء غير المتصلين إلى الخادم.

كنت أتوقع أن يقوم الخادم بإسقاط / إغلاق الاتصالات القديمة دون إرفاق عميل.

هل هذا سلوك متوقع؟

أنا أستخدم Socket.io v1.4.5 مع Node v5.4.1

إليك نموذج التعليمات البرمجية:

io.on('connection', function (socket) {

  // console.log(socket.connected);
  console.log('===================');

  setInterval(() => {
    console.log(socket.conn.id);
    socket.emit('data', { ts: new Date() });
  }, 1000);

});

إليك ناتج console.log عندما أقوم بتحديث المتصفح كل ثانيتين.

يمكنك رؤية socket.conn.id لكل تحديث للمتصفح يتم إرساله إليه.

❯ node app.js                                                                                                                                       ⏎
===================
kkizbfn-82gNOsyAAAAA
kkizbfn-82gNOsyAAAAA
===================
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
===================
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
===================
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
_GmZXIXg8VgUrdKlAAAD
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
_GmZXIXg8VgUrdKlAAAD

حتى بعد عدة ساعات وعدم وجود عملاء (متصفحات) متصلة ، لا تزال الاتصالات القديمة تُرسل إليها.

التعليق الأكثر فائدة

@ StevenBock آه حسنًا .. نعم هذا جيد - شكرًا!

لدي نفس المشكلة مع هذا المثال الآخر.

أرغب في إنشاء ملف وإرسال كل سطر جديد إلى العميل.

باستخدام وحدة npm 'tail' ، يعمل هذا الرمز بشكل جيد ، ولكن لديه هذا التمسك بمشكلة الاتصالات القديمة:

const io = require('socket.io')(8080);

const Tail = require('tail').Tail;
const tailTmpFile = new Tail("./tmp.txt");

io.on('connection', function (socket) {

  console.log(socket.conn.id);

  tailTmpFile.on("line", function (data) {
      console.log('emitting Yes: ', socket.conn.id);
      socket.emit('file', { data: data, ts: Date() });
  });

});

بطريقة ما أحتاج إلى التخلص من حدث الذيل (tailTmpFile.on) عند فصل المقبس.

ال 4 كومينتر

تحتاج إلى مسح الفاصل الزمني عند قطع الاتصال باستخدام clearInterval.

var oneSecondInterval = setInterval(() => {
    console.log(socket.conn.id);
    socket.emit('data', { ts: new Date() });
  }, 1000);

socket.on('disconnect', function(){
    clearInterval(oneSecondInterval);
});

هذا يجب أن يمنعه من التمسك بالاتصالات القديمة.

@ StevenBock آه حسنًا .. نعم هذا جيد - شكرًا!

لدي نفس المشكلة مع هذا المثال الآخر.

أرغب في إنشاء ملف وإرسال كل سطر جديد إلى العميل.

باستخدام وحدة npm 'tail' ، يعمل هذا الرمز بشكل جيد ، ولكن لديه هذا التمسك بمشكلة الاتصالات القديمة:

const io = require('socket.io')(8080);

const Tail = require('tail').Tail;
const tailTmpFile = new Tail("./tmp.txt");

io.on('connection', function (socket) {

  console.log(socket.conn.id);

  tailTmpFile.on("line", function (data) {
      console.log('emitting Yes: ', socket.conn.id);
      socket.emit('file', { data: data, ts: Date() });
  });

});

بطريقة ما أحتاج إلى التخلص من حدث الذيل (tailTmpFile.on) عند فصل المقبس.

@ StevenBock حسنًا ، حسنًا -

هذا الرمز يزيل مستمع الحدث عند قطع الاتصال.

io.on('connection', function (socket) {

  console.log(socket.conn.id);

  var emitLine = function () {
    var callback = function (data) {
      socket.emit('file', { data: data, ts: Date() });
    }
    tailTmpFile.on("line", callback);

    // dispose function
    return function() {
      tailTmpFile.removeListener('line', callback);
    }
  }();

  socket.on('disconnect', function () {
    // dispose tail file listener
    emitLine();
  });

});

شكرًا جزيلاً على الوقت الذي استغرقته في الرد ، لقد وضعني حقًا في الاتجاه الصحيح.

هتافات.

سعيد للمساعدة!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات