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


117

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:


146

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 .


Quindi lo sto facendo e costringe il client a disconnettersi, sfortunatamente sembra che il client si ricolleghi immediatamente. Sto fraintendendo cosa sta succedendo o è questo il comportamento previsto?
kybernetikos

@kybernetikos Sì, me lo sarei aspettato: il cliente può scegliere cosa fare del proprio dopo tutto. Spesso, si desidera eliminare l'altro lato dalla connessione corrente , ad esempio a causa di un timeout di autenticazione: una riconnessione dopo questo sarebbe probabilmente addirittura desiderabile.
nh2

Quindi conosci un modo per dire al cliente "vai via e lo dico sul serio"? Sto pensando dal punto di vista di determinare che un client si sta comportando male e non voglio che utilizzino risorse sul mio server.
kybernetikos

@kybernetikos No, non puoi farlo (generalmente). Se stai programmando il lato client, puoi ovviamente implementare qualsiasi logica tu voglia, ad esempio impedirgli di ricollegarsi. In caso contrario, cacciare ripetutamente gli utenti o, se davvero necessario, ricorrere a tecniche di blocco standard; più basso è il livello di implementazione (ad esempio 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).
nh2

1
@ManishSapkal Dovresti probabilmente aprire una nuova domanda per questo, non si adatta bene ai commenti.
nh2

15

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?


1
Non devi più chiamare Client.emit('disconnect')manualmente con le recenti versioni di socket.io, ora c'è un lato server socket.disconnect()(vedi la mia risposta).
NH2

5
A causa dei recenti aggiornamenti, la tua risposta non è corretta ora, da cui -1.
corazza

Sono d'accordo, questa risposta non è più valida, perché ora socket.disconnect()può essere utilizzata anche lato server.
Vassilis Barzokas

@VassilisBarzokas E se volessi una richiamata e passassi alcuni parametri alla richiamata al termine della disconnect()funzione?
newguy

creare una serie di messaggi concordati in cui una parte informi l'altra parte che desidera disconnettersi, quindi fare ciò che è necessario fare e quindi disconnettersi effettivamente.
Mike 'Pomax' Kamermans il

8

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

7
Perché il codice lato client non può mai essere considerato affidabile per funzionare esattamente come desideri. Gli utenti possono modificarlo facilmente.
Kaustubh Karkare

4

Supponendo che il socket con nome del tuo socket, usa:

socket.disconnect()

2
Purtroppo, questo non funziona. Sto cercando di chiudere la connessione a un client specifico dal lato server.
Daniel Kenney

4

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 :)


Come trovo il socket dell'utente disconnesso sul server?
Manish Sapkal

Manish: Ascolta l' disconnectevento del socket per scoprire se si è disconnesso. Può anche essere l' closeevento, non ne sono del tutto sicuro. Vedere la documentazione di socket.io per ulteriori informazioni su questo.
Sascha Gehlich


3

Nel mio caso volevo abbattere la connessione sottostante, nel qual caso ho dovuto chiamare socket.disconnect(true) come puoi vedere è necessario dalla fonte qui


2

client._onDisconnect() dovrebbe funzionare


1
Funziona perfettamente .. Im mantenere la mia mappatura ai clienti .. usando quella mappatura ... disconnettere facilmente i clienti .. applausi
Arenstar

1

Socket.io utilizza il pattern EventEmitter per disconnettere / connettere / controllare gli heartbeat in modo da poterlo fare. Client.emit('disconnect');


1

Questo non ha funzionato per me:

`socket.disconnect()` 

Questo ha funzionato per me:

socket.disconnect(true)

La consegna truechiuderà 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');
// });

0

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


0

Sto usando sul lato client socket.disconnect();

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

0

uso :

socket.Disconnect () // ok

non usare :

socket.disconnect ()


0

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;

-1

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();                      
    });    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.