forzar la desconexión del cliente del servidor con socket.io y nodejs

117

¿Hay alguna forma de desconectar un cliente con SocketIO y, literalmente, cerrar la conexión? Entonces, si alguien está conectado a mi servidor y quiero cerrar la conexión entre ellos y mi servidor, ¿cómo puedo hacerlo?

Daniel Kenney
fuente

Respuestas:

145

Editar: esto ahora es posible

Ahora puede simplemente llamar socket.disconnect()en el lado del servidor .

Mi respuesta original:

Esto todavía no es posible.

Si también lo necesita, vote / comente sobre este tema .

nh2
fuente
Así que estoy haciendo eso, y obliga al cliente a desconectarse, desafortunadamente parece que el cliente simplemente se vuelve a conectar inmediatamente. ¿Estoy malinterpretando lo que está sucediendo o es ese el comportamiento esperado?
kybernetikos
@kybernetikos Sí, esperaría esto: el cliente puede elegir qué hacer con el suyo después de todo. A menudo, desea patear el otro lado de la conexión actual , por ejemplo, debido a un tiempo de espera de autenticación; una reconexión después de esto probablemente incluso sería deseable.
nh2
Entonces, ¿conoce alguna forma de decirle al cliente 'vete y lo digo en serio'? Estoy pensando desde el punto de vista de determinar que un cliente se está portando mal y no quiere que use recursos en mi servidor.
kybernetikos
@kybernetikos No, no puedes hacer eso (generalmente). Sin embargo, si está programando el lado del cliente, por supuesto, puede implementar cualquier lógica que desee, por ejemplo, evitar que se vuelva a conectar. Si no es así, tendrá que patear repetidamente a los usuarios o, si es realmente necesario, recurrir a técnicas de bloqueo estándar; cuanto más bajo se implementen (por ejemplo iptables), más recursos ahorrará. Sin embargo, en la mayoría de los casos, basta con patear al cliente, ya que socketio no se conecta tan rápido, y si alguien realmente quiere DoS, tiene otras formas de todos modos (por ejemplo, descargar páginas suyas).
nh2
1
@ManishSapkal Probablemente debería abrir una nueva pregunta para eso, no encaja bien en los comentarios.
nh2
15

socket.disconnect() solo se puede utilizar en el lado del cliente, no en el lado del servidor.

Client.emit('disconnect')desencadena el evento de desconexión en el servidor, pero no desconecta efectivamente al cliente. El cliente no se da cuenta de la desconexión.

Entonces, la pregunta sigue siendo: ¿cómo obligar a un cliente a desconectarse del servidor?

Fabien
fuente
1
Ya no tiene que llamar Client.emit('disconnect')manualmente con las versiones recientes de socket.io, ahora hay un lado del servidor socket.disconnect()(vea mi respuesta).
nh2
5
Debido a las actualizaciones recientes, su respuesta es incorrecta ahora, de ahí el -1.
corazza
Estoy de acuerdo, esta respuesta ya no es válida, porque ahora también socket.disconnect()se puede usar en el lado del servidor.
Vassilis Barzokas
@VassilisBarzokas ¿Qué sucede si quiero una devolución de llamada y paso algunos parámetros a la devolución de llamada una vez finalizada la disconnect()función?
newguy
Cree un conjunto acordado de mensajes en el que una parte le informe a la otra parte que desea desconectarse, luego haga lo que tenga que hacer y luego desconecte.
Mike 'Pomax' Kamermans
8

¿Alguna razón por la que no puede hacer que el servidor emita un mensaje al cliente que lo haga llamar a la función de desconexión?

En cliente:

socket.emit('forceDisconnect');

En el servidor:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});
quahada
fuente
7
Porque nunca se puede confiar en que el código del lado del cliente funcione exactamente como usted desea. Los usuarios pueden modificarlo fácilmente.
Kaustubh Karkare
4

Suponiendo que el socket con nombre de su socket, use:

socket.disconnect()
Erik
fuente
2
Desafortunadamente, esto no funciona. Estoy intentando cerrar la conexión a un cliente específico desde el lado del servidor.
Daniel Kenney
4

Para aquellos que encontraron esto en Google, hay una solución para esto ahora mismo:

Socket.disconnect()patea al cliente (lado del servidor). No hay posibilidad de que el cliente se mantenga conectado :)

Sascha Gehlich
fuente
¿Cómo encuentro el zócalo del usuario que está desconectado en el servidor?
Manish Sapkal
Manish: Escuche el disconnectevento del socket para averiguar si se ha desconectado. También puede ser el closeevento, no estoy muy seguro. Consulte la documentación de socket.io para obtener más información al respecto.
Sascha Gehlich
3

En mi caso, quería eliminar la conexión subyacente, en cuyo caso tuve que llamar, socket.disconnect(true)como puede ver, se necesita de la fuente aquí.

Duncan
fuente
2

client._onDisconnect() Deberia trabajar

Emmerman
fuente
1
Esto funciona perfectamente ... Mantengo mi propio mapeo para los clientes ... usando ese mapeo ... desconectando clientes fácilmente ... saludos
Arenstar
1

Socket.io usa el patrón EventEmitter para desconectar / conectar / verificar latidos para que pueda hacerlo. Client.emit('disconnect');

Anthony Wlodarski
fuente
1

Esto no funcionó para mí:

`socket.disconnect()` 

Esto funcionó para mí:

socket.disconnect(true)

La transferencia truecerrará la conexión subyacente con el cliente y no solo el espacio de nombres que el cliente está conectado a la documentación de Socket IO .


Un ejemplo de caso de uso: el cliente se conectó al servidor de socket web con un token de acceso no válido (el token de acceso se entregó al servidor de socket web con parámetros de conexión). El servidor de socket web notifica al cliente que va a cerrar la conexión, debido a su token de acceso no válido:

// (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
fuente
0

Estoy usando client.emit('disconnect')+ client.removeAllListeners()para el cliente conectado para ignorar todos los eventos después de desconectar

Skyman
fuente
0

Estoy usando en el lado del cliente socket.disconnect();

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

utilizar :

socket.Disconnect () // ok

no utilice :

socket.disconnect ()

m-tech
fuente
0

Puede socket = undefinedborrar qué enchufe ha conectado. Entonces, cuando quiera conectarse, haga socket (url)

Entonces se verá así

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

let socket;

// Connect to server
socket = socketClient(url)

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

Agregue nuevas conexiones de socket a una matriz y luego, cuando desee cerrarlas todas, realice un bucle y desconéctelas. (lado del servidor)

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
fuente