Socket.io: Émission vers les anciennes connexions lors de l'actualisation du navigateur et conservation des anciennes connexions

Créé le 1 févr. 2016  ·  4Commentaires  ·  Source: socketio/socket.io

Salut,

J'ai une configuration de test de serveur socket.io simple qui envoie la Date() actuelle à un seul client.

Toutes les 1 seconde, le serveur envoie (émet) la Date() à un client.

Si j'actualise la fenêtre du navigateur, j'ai toujours une connexion mais le serveur émet sur deux connexions.

Si j'actualise la fenêtre du navigateur, j'ai toujours une connexion mais le serveur émet sur trois connexions.

Si j'actualise la fenêtre du navigateur, j'ai toujours une connexion mais le serveur émet sur quatre connexions.

Ainsi de suite...

Même après plusieurs heures, les clients déconnectés sont toujours émis par le serveur.

Je m'attendais à ce que le serveur abandonne/ferme les anciennes connexions sans client connecté.

Est-ce un comportement attendu ?

J'utilise Socket.io v1.4.5 avec Node v5.4.1

Voici un exemple de code :

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

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

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

});

Voici la sortie console.log lorsque j'actualise le navigateur toutes les 2 secondes.

Vous pouvez voir le socket.conn.id pour chaque actualisation du navigateur.

❯ 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

Même après de nombreuses heures et sans clients connectés (navigateurs), les anciennes connexions sont toujours émises.

Commentaire le plus utile

@StevenBock Ah OK .. oui tout va bien - merci!

J'ai le même problème avec cet autre exemple.

Je voudrais suivre un fichier et envoyer chaque nouvelle ligne au client.

En utilisant le module npm 'tail', ce code fonctionne correctement, mais a ce problème de maintien des anciennes connexions :

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

});

D'une manière ou d'une autre, j'ai besoin de supprimer l'événement de queue (tailTmpFile.on) lorsque le socket se déconnecte.

Tous les 4 commentaires

Vous devez effacer l'intervalle lors de la déconnexion avec clearInterval.

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

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

Cela devrait l'empêcher de conserver les anciennes connexions.

@StevenBock Ah OK .. oui tout va bien - merci!

J'ai le même problème avec cet autre exemple.

Je voudrais suivre un fichier et envoyer chaque nouvelle ligne au client.

En utilisant le module npm 'tail', ce code fonctionne correctement, mais a ce problème de maintien des anciennes connexions :

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

});

D'une manière ou d'une autre, j'ai besoin de supprimer l'événement de queue (tailTmpFile.on) lorsque le socket se déconnecte.

@StevenBock OK super - j'ai compris.

Ce code supprime l'écouteur d'événement lors de la déconnexion.

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

});

Merci d'avoir pris le temps de répondre, cela m'a vraiment mis dans la bonne direction.

Acclamations.

Heureux de vous aider!

Cette page vous a été utile?
0 / 5 - 0 notes