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 dovrei farlo?
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 dovrei farlo?
Risposte:
Modifica: ora è possibile
Ora puoi semplicemente chiamare socket.disconnect()
dal lato server .
La mia risposta originale:
Questo non è ancora possibile.
Se anche tu ne hai bisogno, vota / commenta questo problema .
iptables
), più risorse risparmierai. Nella maggior parte dei casi, semplicemente cacciare il client dovrebbe essere sufficiente, poiché socketio non si connette così rapidamente e se qualcuno vuole davvero farlo, ha comunque altri modi (ad esempio scaricare pagine da te).
socket.disconnect()
può essere utilizzato solo sul lato client, non sul lato server.
Client.emit('disconnect')
attiva l'evento di disconnessione sul server, ma non disconnette efficacemente il client. Il client non è a conoscenza della disconnessione.
Quindi la domanda rimane: come forzare un client a disconnettersi dal lato server?
Client.emit('disconnect')
manualmente con le recenti versioni di socket.io, ora c'è un lato server socket.disconnect()
(vedi la mia risposta).
socket.disconnect()
può essere utilizzata anche lato server.
disconnect()
funzione?
C'è qualche motivo per cui non puoi fare in modo che il server invii un messaggio al client che gli faccia chiamare la funzione di disconnessione?
Sul cliente:
socket.emit('forceDisconnect');
Sul server:
socket.on('forceDisconnect', function(){
socket.disconnect();
});
Supponendo che il socket con nome del tuo socket, usa:
socket.disconnect()
Per coloro che hanno trovato questo su Google, c'è una soluzione per questo in questo momento:
Socket.disconnect()
prende a calci il client (lato server). Nessuna possibilità per il cliente di rimanere in contatto :)
disconnect
evento del socket per scoprire se si è disconnesso. Può anche essere l' close
evento, non ne sono del tutto sicuro. Vedere la documentazione di socket.io per ulteriori informazioni su questo.
Controllando questa mattina sembra che sia ora:
socket.close()
Socket.io utilizza il pattern EventEmitter per disconnettere / connettere / controllare gli heartbeat in modo da poterlo fare. Client.emit('disconnect');
Questo non ha funzionato per me:
`socket.disconnect()`
Questo ha funzionato per me:
socket.disconnect(true)
La consegna true
chiuderà la connessione sottostante al client e non solo lo spazio dei nomi a cui il client è connesso alla documentazione Socket IO .
Un esempio di caso d'uso: il client si è connesso al server web socket con token di accesso non valido (token di accesso consegnato al server web socket con parametri di connessione). Il server Web socket notifica al client che chiuderà 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');
// });
Tu puoi fare socket = undefined
cancellare quale presa hai collegato. Quindi quando vuoi connetterti fai socket (url)
Quindi sarà così
const socketClient = require('socket.io-client');
let socket;
// Connect to server
socket = socketClient(url)
// When want to disconnect
socket = undefined;
Aggiungere nuove connessioni socket a un array e quindi quando si desidera chiudere tutto, eseguire il loop e disconnettersi. (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();
});