forzare la disconnessione del client dal server con socket.io e nodejs

C’è un modo per disconnettere un client con SocketIO e chiudere letteralmente la connessione? Quindi se qualcuno è connesso al mio server e voglio chiudere la connessione tra loro e il mio server, come farei per farlo?

Modifica: ora è ansible

Ora puoi semplicemente chiamare socket.disconnect() sul lato server .

La mia risposta originale:

Questo non è ancora ansible.

Se ne hai bisogno, vota / commenta questo problema .

socket.disconnect() può essere utilizzato solo sul lato client, non sul lato server.

Client.emit('disconnect') triggers l’evento di disconnessione sul server, ma non disconnette in modo efficace il client. Il client non è a conoscenza della disconnessione.

Quindi la domanda rimane: come forzare un client a disconnettersi dal lato server?

Qualsiasi motivo per cui non è ansible che il server emetta un messaggio sul client che lo faccia chiamare la funzione di disconnessione?

Sul client:

 socket.emit('forceDisconnect'); 

Sul server:

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

Supponendo che il socket del socket abbia il nome, usa:

 socket.disconnect() 

Per coloro che hanno trovato questo su google – ora c’è una soluzione per questo:

Socket.disconnect() calcio al client (lato server). Nessuna possibilità per il cliente di rimanere connesso 🙂

Nel mio caso volevo abbattere la connessione sottostante nel qual caso dovevo chiamare socket.disconnect(true) come si può vedere è necessario dalla sorgente qui

client._onDisconnect() dovrebbe funzionare

Socket.io utilizza il pattern EventEmitter per disconnettere / connettere / verificare heartbeat in modo che tu possa fare. Client.emit('disconnect');

Sto usando client.emit('disconnect') + client.removeAllListeners() per il client connesso per ignorare tutti gli eventi dopo la disconnessione

Sto usando sul lato client socket.disconnect();

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

Questo non ha funzionato per me:

 `socket.disconnect()` 

Questo ha funzionato per me:

 socket.disconnect(true) 

Passando true si chiuderà la connessione underlay al client e non solo lo spazio dei nomi che il client è connesso a Socket IO Documentation .


Caso di utilizzo di esempio: il client si è connesso al server socket Web con token di accesso non valido (token di accesso consegnato al server socket Web con parametri di connessione). Il server socket Web notifica al client che sta per chiudere la connessione, a causa del suo token di accesso non valido:

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

Aggiungi nuove connessioni socket a un array e poi quando vuoi chiuderle tutte, fai un loop e disconnetti. (lato server)

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