Socket.io: Memancarkan ke koneksi lama pada penyegaran browser dan mempertahankan koneksi lama

Dibuat pada 1 Feb 2016  ·  4Komentar  ·  Sumber: socketio/socket.io

Hai,

Saya memiliki pengaturan pengujian server socket.io sederhana yang mengirimkan Date() saat ini ke satu klien.

Setiap 1 detik server mengirimkan (memancarkan) Date() ke satu klien.

Jika saya menyegarkan jendela browser, saya masih memiliki satu koneksi tetapi server memancarkan ke dua koneksi.

Jika saya menyegarkan jendela browser, saya masih memiliki satu koneksi tetapi server memancarkan ke tiga koneksi.

Jika saya me-refresh jendela browser, saya masih memiliki satu koneksi tetapi server memancarkan ke empat koneksi.

Dan seterusnya dan seterusnya...

Bahkan setelah beberapa jam, klien yang terputus masih dipancarkan oleh server.

Saya mengharapkan server untuk menjatuhkan/menutup koneksi lama tanpa klien terpasang.

Apakah ini perilaku yang diharapkan?

Saya menggunakan Socket.io v1.4.5 dengan Node v5.4.1

Berikut ini contoh kode:

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

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

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

});

Inilah hasil console.log ketika saya me-refresh browser setiap 2 detik.

Anda dapat melihat socket.conn.id untuk setiap refresh browser yang dipancarkan.

❯ 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

Bahkan setelah berjam-jam dan tidak ada klien (browser) yang terhubung, koneksi lama masih dipancarkan.

Komentar yang paling membantu

@StevenBock Ah OK .. ya itu semua baik - terima kasih!

Saya memiliki masalah yang sama dengan contoh lain ini.

Saya ingin mengekor file dan mengirim setiap baris baru ke klien.

Menggunakan modul 'ekor' npm kode ini berfungsi dengan baik, tetapi memiliki masalah koneksi lama:

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() });
  });

});

Entah bagaimana saya harus membuang acara ekor (tailTmpFile.on) ketika soket terputus.

Semua 4 komentar

Anda perlu menghapus interval saat memutuskan sambungan dengan clearInterval.

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

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

Ini harus menghentikannya dari berpegang pada koneksi lama.

@StevenBock Ah OK .. ya itu semua baik - terima kasih!

Saya memiliki masalah yang sama dengan contoh lain ini.

Saya ingin mengekor file dan mengirim setiap baris baru ke klien.

Menggunakan modul 'ekor' npm kode ini berfungsi dengan baik, tetapi memiliki masalah koneksi lama:

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() });
  });

});

Entah bagaimana saya harus membuang acara ekor (tailTmpFile.on) ketika soket terputus.

@StevenBock Oke bagus - mengerti.

Kode ini menghapus event listener saat disconnect.

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();
  });

});

Terima kasih telah meluangkan waktu untuk menjawab, itu benar-benar mengarahkan saya ke arah yang benar.

Bersulang.

Senang untuk membantu!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat