forcer la déconnexion du client du serveur avec socket.io et nodejs

117

Existe-t-il un moyen de déconnecter un client avec SocketIO et de fermer littéralement la connexion? Donc, si quelqu'un est connecté à mon serveur et que je souhaite fermer la connexion entre lui et mon serveur, comment procéder?

Daniel Kenney
la source

Réponses:

146

Edit: c'est désormais possible

Vous pouvez maintenant simplement appeler socket.disconnect()côté serveur .

Ma réponse originale:

Ce n'est pas encore possible.

Si vous en avez également besoin, votez / commentez cette question .

nh2
la source
Donc je fais cela, et cela force le client à se déconnecter, malheureusement il semble que le client se reconnecte simplement immédiatement. Est-ce que je comprends mal ce qui se passe ou est-ce le comportement attendu?
kybernetikos
@kybernetikos Oui, je m'attendrais à cela - le client peut choisir quoi faire du sien après tout. Souvent, vous voulez expulser l'autre côté de la connexion actuelle , par exemple à cause d'un délai d'authentification - une reconnexion après cela serait probablement même souhaitable.
nh2
Alors, connaissez-vous un moyen de dire au client «partez et je le pense vraiment»? Je pense du point de vue de déterminer qu'un client se comporte mal et ne veut pas qu'il utilise les ressources de mon serveur.
kybernetikos
@kybernetikos Non, vous ne pouvez pas faire ça (généralement). Si vous programmez le côté client, vous pouvez bien sûr implémenter la logique de votre choix, par exemple l'empêcher de se reconnecter. Si ce n'est pas le cas, il faut renvoyer les utilisateurs à plusieurs reprises ou, si vraiment nécessaire, recourir aux techniques de blocage standard; plus ils sont implémentés de niveau inférieur (par exemple iptables), plus vous économiserez de ressources. Dans la plupart des cas, le simple fait de donner un coup de pied au client devrait être suffisant, puisque socketio ne se connecte pas aussi rapidement, et si quelqu'un veut vraiment vous faire du DoS, il a quand même d'autres moyens (par exemple, télécharger des pages de votre part).
nh2
1
@ManishSapkal Vous devriez probablement ouvrir une nouvelle question pour cela, elle ne rentre pas bien dans les commentaires.
nh2
15

socket.disconnect() ne peut être utilisé que du côté client, pas du côté serveur.

Client.emit('disconnect')déclenche l'événement de déconnexion sur le serveur, mais ne déconnecte pas efficacement le client. Le client n'a pas connaissance de la déconnexion.

La question demeure donc: comment forcer un client à se déconnecter du côté serveur?

Fabien
la source
1
Vous n'avez plus besoin d'appeler Client.emit('disconnect')manuellement avec les versions récentes de socket.io, il y a maintenant un côté serveur socket.disconnect()(voir ma réponse).
nh2
5
En raison de mises à jour récentes, votre réponse est incorrecte maintenant, d'où le -1.
corazza
Je suis d'accord, cette réponse n'est plus valable, car maintenant le socket.disconnect()peut également être utilisé côté serveur.
Vassilis Barzokas
@VassilisBarzokas Que faire si je souhaite un rappel et que je passe certains paramètres au rappel une fois la disconnect()fonction terminée?
newguy
créer un ensemble de messages convenu dans lequel une partie informe l'autre partie qu'elle souhaite se déconnecter, puis faire ce que vous devez faire, puis vous déconnecter.
Mike 'Pomax' Kamermans
8

Une raison pour laquelle vous ne pouvez pas faire en sorte que le serveur émette un message au client qui lui fait appeler la fonction de déconnexion?

Sur le client:

socket.emit('forceDisconnect');

Sur le serveur:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});
quahada
la source
7
Parce que le code côté client ne peut jamais être utilisé pour fonctionner exactement comme vous le souhaitez. Les utilisateurs peuvent facilement le modifier.
Kaustubh Karkare
4

En supposant que le socket nommé de votre socket, utilisez:

socket.disconnect()
Erik
la source
2
Malheureusement, cela ne fonctionne pas. J'essaye de fermer la connexion à un client spécifique du côté serveur.
Daniel Kenney
4

Pour ceux qui ont trouvé cela sur google, il existe une solution pour cela en ce moment:

Socket.disconnect()lance le client (côté serveur). Aucune chance pour le client de rester connecté :)

Sascha Gehlich
la source
Comment trouver le socket de l'utilisateur déconnecté du serveur?
Manish Sapkal
Manish: Écoutez l' disconnectévénement du socket pour savoir s'il s'est déconnecté. Peut aussi être l' closeévénement, je ne suis pas sûr. Consultez la documentation de socket.io pour plus d'informations à ce sujet.
Sascha Gehlich
3

Dans mon cas, je voulais démanteler la connexion sous-jacente, auquel cas je devais appeler socket.disconnect(true)comme vous pouvez le voir est nécessaire à partir de la source ici

Duncan
la source
2

client._onDisconnect() devrait marcher

Emmerman
la source
1
Cela fonctionne parfaitement .. Je maintiens ma propre cartographie avec les clients .. en utilisant cette cartographie ... en déconnectant facilement les clients ..
bravo
1

Socket.io utilise le modèle EventEmitter pour déconnecter / connecter / vérifier les pulsations afin que vous puissiez le faire. Client.emit('disconnect');

Anthony Wlodarski
la source
1

Cela n'a pas fonctionné pour moi:

`socket.disconnect()` 

Cela a fonctionné pour moi:

socket.disconnect(true)

Le transfert truefermera la connexion sous-jacente au client et pas seulement à l'espace de noms auquel le client est connecté à la documentation Socket IO .


Exemple de cas d'utilisation: le client s'est connecté au serveur de socket Web avec un jeton d'accès non valide (jeton d'accès remis au serveur de socket Web avec des paramètres de connexion). Le serveur de socket Web informe le client qu'il va fermer la connexion, en raison de son jeton d'accès non valide:

// (1) the server code emits
socket.emit('invalidAccessToken', function(data) {
    console.log(data);       // (4) server receives 'invalidAccessTokenEmitReceived' from client
    socket.disconnect(true); // (5) force disconnect client 
});

// (2) the client code listens to event
// client.on('invalidAccessToken', (name, fn) => { 
//     // (3) the client ack emits to server
//     fn('invalidAccessTokenEmitReceived');
// });
Baran Emre
la source
0

J'utilise client.emit('disconnect')+ client.removeAllListeners()pour le client connecté pour ignorer tous les événements après la déconnexion

skyman
la source
0

J'utilise côté client socket.disconnect();

client.emit('disconnect') didnt work for me
Yonia
la source
0

utilisation :

socket.Disconnect () // ok

ne pas utiliser :

socket.disconnect ()

m-tech
la source
0

Vous pouvez socket = undefinedeffacer la prise que vous avez connectée. Donc, quand vous voulez vous connecter, faites socket (url)

Donc ça ressemblera à ça

const socketClient = require('socket.io-client');

let socket;

// Connect to server
socket = socketClient(url)

// When want to disconnect
socket = undefined;
Saurabh Gupta
la source
-1

Ajoutez de nouvelles connexions de socket à un tableau, puis lorsque vous souhaitez tout fermer, faites une boucle et déconnectez-les. (du côté serveur)

var socketlist = [];

   io.sockets.on('connection', function (socket) {
        socketlist.push(socket);  
        //...other code for connection here..
   });


    //close remote sockets
    socketlist.forEach(function(socket) {        
        socket.disconnect();                      
    });    
PodTech.io
la source