¿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?
¿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?
Respuestas:
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 .
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).
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?
Client.emit('disconnect')
manualmente con las versiones recientes de socket.io, ahora hay un lado del servidor socket.disconnect()
(vea mi respuesta).
socket.disconnect()
se puede usar en el lado del servidor.
disconnect()
función?
¿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();
});
Suponiendo que el socket con nombre de su socket, use:
socket.disconnect()
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 :)
disconnect
evento del socket para averiguar si se ha desconectado. También puede ser el close
evento, no estoy muy seguro. Consulte la documentación de socket.io para obtener más información al respecto.
Verificando esta mañana parece que es ahora:
socket.close()
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í.
Socket.io usa el patrón EventEmitter para desconectar / conectar / verificar latidos para que pueda hacerlo. Client.emit('disconnect');
Esto no funcionó para mí:
`socket.disconnect()`
Esto funcionó para mí:
socket.disconnect(true)
La transferencia true
cerrará 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');
// });
Puede socket = undefined
borrar 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;
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();
});