Socket.io: Senden an alte Verbindungen bei Browseraktualisierung und Beibehalten alter Verbindungen

Erstellt am 1. Feb. 2016  ·  4Kommentare  ·  Quelle: socketio/socket.io

Hallo,

Ich habe ein einfaches socket.io-Server-Test-Setup, das das aktuelle Date() an einen einzelnen Client sendet.

Alle 1 Sekunde sendet (emittiert) der Server das Date() an einen Client.

Wenn ich das Browserfenster aktualisiere, habe ich immer noch eine Verbindung, aber der Server gibt an zwei Verbindungen aus.

Wenn ich das Browserfenster aktualisiere, habe ich immer noch eine Verbindung, aber der Server gibt an drei Verbindungen aus.

Wenn ich das Browserfenster aktualisiere, habe ich immer noch eine Verbindung, aber der Server gibt an vier Verbindungen aus.

Und so weiter und so weiter...

Auch nach mehreren Stunden werden die getrennten Clients immer noch vom Server an sie emittiert.

Ich hatte erwartet, dass der Server die alten Verbindungen ohne angeschlossenen Client abbricht/schließt.

Ist das erwartetes Verhalten?

Ich verwende Socket.io v1.4.5 mit Node v5.4.1

Hier ist ein Codebeispiel:

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

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

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

});

Hier ist die Ausgabe von console.log, wenn ich den Browser alle 2 Sekunden aktualisiere.

Sie können die socket.conn.id für jede Browseraktualisierung sehen, an die gesendet wird.

❯ 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

Auch nach vielen Stunden und ohne verbundene Clients (Browser) werden immer noch die alten Verbindungen ausgegeben.

Hilfreichster Kommentar

@StevenBock Ah OK .. ja das ist alles gut - danke!

Ich habe das gleiche Problem mit diesem anderen Beispiel.

Ich möchte eine Datei tailen und jede neue Zeile an den Client senden.

Mit dem npm-Modul „tail“ funktioniert dieser Code einwandfrei, hat aber das Problem, alte Verbindungen festzuhalten:

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

});

Irgendwie muss ich das Tail-Ereignis (tailTmpFile.on) entsorgen, wenn der Socket die Verbindung trennt.

Alle 4 Kommentare

Sie müssen das Intervall beim Trennen mit clearInterval löschen.

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

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

Dies sollte verhindern, dass es an den alten Verbindungen festhält.

@StevenBock Ah OK .. ja das ist alles gut - danke!

Ich habe das gleiche Problem mit diesem anderen Beispiel.

Ich möchte eine Datei tailen und jede neue Zeile an den Client senden.

Mit dem npm-Modul „tail“ funktioniert dieser Code einwandfrei, hat aber das Problem, alte Verbindungen festzuhalten:

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

});

Irgendwie muss ich das Tail-Ereignis (tailTmpFile.on) entsorgen, wenn der Socket die Verbindung trennt.

@StevenBock OK toll - verstanden.

Dieser Code entfernt den Ereignis-Listener beim Trennen.

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

});

Vielen Dank, dass Sie sich die Zeit genommen haben zu antworten, es hat mich wirklich in die richtige Richtung gelenkt.

Beifall.

Froh, dass ich Helfen kann!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen