web-dev-qa-db-fra.com

Node.js: socket.io ferme la connexion client

Comment puis-je fermer la connexion socket côté client?

J'utilise: 

  • socket.io 0.9
  • node.js 0.10.15
  • express 3.3.4

i.e.:call localhost/test
-- du côté serveur

var test = io
.of('/test')
.on('connection', function (socket) {

  console.log('open socket: ' + socket);

  socket.on('disconnect', function () {
    console.log('disconnected event');
    //socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side
    //socket.disconnect(); --> same here
  });
});

-- côté client

var socket = io.connect('http://localhost:3000/test');
socket.on('disconnect', function () {
   console.log('disconnect client event....');
});

socket.emit('getInitData', function (data) {
  .. do something with data
});

Si je charge la page de test, j'ai besoin de certaines valeurs du serveur (getInitData).
Lors de la première visite, je reçois les données une fois, lors d’un rechargement ou d’une deuxième visite, je les reçois deux fois, etc. 

La connexion côté serveur est automatiquement fermée lors du rechargement de la page et si vous quittez la page.
Mais du côté client, la connexion est toujours ouverte.
Comment puis-je fermer la connexion côté client ou vérifier s'il y a déjà une connexion ouverte?

METTRE À JOUR
J'ai maintenant essayé ce qui suit: (côté client)

window.onbeforeunload = function(e) {
  socket.disconnect();
};

Cela déclenche du côté client l'événement disconnect, mais j'obtiens toujours la réponse double ou triple.

37
baam

Il n’existe pas de connexion côté serveur et/ou navigateur. Il n'y a qu'un seul lien. Si l'un des côtés le ferme, il est fermé (et vous ne pouvez pas envoyer de données à une connexion qui est évidemment fermée).

Maintenant, un navigateur ferme la connexion lorsque vous quittez la page (cela ne dépend pas de la bibliothèque/langue/système d'exploitation que vous utilisez du côté serveur). Ceci est au moins vrai pour WebSockets (cela pourrait ne pas être vrai pour une interrogation longue à cause de keep-alive mais heureusement, socket.io le gère correctement).

Si un problème de ce type se produit, je suis presque sûr qu'il y a un bogue dans votre propre code (côté serveur). Peut-être empilez-vous des gestionnaires d'événements où vous ne devriez pas.

9
freakish

As-tu essayé: 

socket.disconnect() 

sur le client?

62
Milan Babuškov

Pour socket.io version 1.4.5:

Sur le serveur:

socket.on('end', function (){
    socket.disconnect(0);
});

Sur le client:

var io = io();
io.emit('end');
17
Himani Agrawal
socket.disconnect()

Ne redémarre que l'événement de déconnexion de déclenchement de connexion côté client. Mais se connecte à nouveau.

socket.close()

Déconnectez la connexion du client. Le client continuera à essayer de se connecter.

7
Ali Azhar

J'essaie de fermer la connexion des utilisateurs dans la version 1.0 et trouve cette méthode:

socket.conn.close()

La différence entre cette méthode et disconnect () est que le client continuera à essayer de se reconnecter au serveur.

2
JakubKnejzlik

Essayez simplement socket.disconnect(true) du côté serveur en émettant n’importe quel événement du côté client.

0
Lalit Kumar

essayez ceci pour fermer la connexion:

socket.close();

et si vous voulez l'ouvrir à nouveau:

socket.connect();
0
Luis Fletes