web-dev-qa-db-fra.com

forcer le client à se déconnecter du serveur avec socket.io et nodejs

Est-il possible 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 eux et mon serveur, comment procéder pour le faire?

104
Daniel Kenney

Edit: c'est maintenant possible

Vous pouvez maintenant appeler simplement socket.disconnect() sur le serveur .

Ma réponse initiale:

Ce n'est pas encore possible.

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

124
nh2

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'est pas au courant de la déconnexion.

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

16
Fabien

Une raison pour laquelle vous ne pouvez pas demander au serveur d’émettre un message au client lui demandant d’appeler la fonction de déconnexion?

Sur le client:

socket.emit('forceDisconnect');

Sur le serveur:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});
8
quahada

En supposant que la socket nommée de votre socket, utilisez:

socket.disconnect()
4
Erik

Pour ceux qui ont trouvé cela sur Google - il existe une solution pour cela maintenant:

Socket.disconnect() donne le coup de pied au client (côté serveur). Aucune chance pour le client de rester connecté :)

4
Sascha Gehlich

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

3
Duncan

En vérifiant ce matin, il semble qu'il soit maintenant:

socket.close()

https://socket.io/docs/client-api/#socket-close

2
HAS-Jack

client._onDisconnect() devrait fonctionner

2
Emmerman

Ceci n'a pas fonctionné pour moi: 

`socket.disconnect()` 

Ceci a fonctionné pour moi: 

socket.disconnect(true)

La remise de true fermera la connexion sous-jacente au client et pas uniquement à l'espace de noms auquel le client est connecté Socket IO Documentation .


Exemple d'utilisation: le client s'est connecté à un serveur de socket Web avec un jeton d'accès non valide (jeton d'accès transféré 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');
// });
1
Bem

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

1
Anthony Wlodarski

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

0
skyman

utilisation :

socket.Disconnect () // ok

ne pas utiliser :

socket.disconnect ()

0
m-tech

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

client.emit('disconnect') didnt work for me
0
yonia