Existe alguma maneira de desconectar um cliente com SocketIO e literalmente fechar a conexão? Portanto, se alguém estiver conectado ao meu servidor e eu quiser encerrar a conexão entre essa pessoa e meu servidor, como devo proceder para fazer isso?
Existe alguma maneira de desconectar um cliente com SocketIO e literalmente fechar a conexão? Portanto, se alguém estiver conectado ao meu servidor e eu quiser encerrar a conexão entre essa pessoa e meu servidor, como devo proceder para fazer isso?
Respostas:
Editar: Isso agora é possível
Agora você pode simplesmente ligar socket.disconnect()no lado do servidor .
Minha resposta original:
Isso ainda não é possível.
Se você também precisar, vote / comente sobre este assunto .
iptables), mais recursos você economizará. Na maioria dos casos, simplesmente chutar o cliente deve ser suficiente, já que o socketio não se conecta tão rapidamente, e se alguém realmente quiser fazer DoS você, eles têm outras maneiras de qualquer maneira (por exemplo, baixando páginas de você).
socket.disconnect() pode ser usado apenas no lado do cliente, não no lado do servidor.
Client.emit('disconnect')dispara o evento de desconexão no servidor, mas não desconecta efetivamente o cliente. O cliente não está ciente da desconexão.
Portanto, a questão permanece: como forçar um cliente a se desconectar do servidor?
Client.emit('disconnect')mais chamar manualmente com as versões recentes de socket.io, agora existe um servidor socket.disconnect()(veja minha resposta).
socket.disconnect()pode ser usado no lado do servidor.
disconnect()função for concluída?
Alguma razão pela qual você não pode fazer com que o servidor emita uma mensagem ao cliente que o faça chamar a função de desconexão?
No cliente:
socket.emit('forceDisconnect');
No servidor:
socket.on('forceDisconnect', function(){
socket.disconnect();
});
Assumindo o soquete nomeado do seu soquete, use:
socket.disconnect()
Para quem encontrou isso no google - existe uma solução para isso agora:
Socket.disconnect()chuta o cliente (lado do servidor). Sem chance para o cliente ficar conectado :)
disconnectevento do soquete para descobrir se ele foi desconectado. Também pode ser o closeevento, não tenho certeza. Consulte a documentação do socket.io para obter mais informações sobre isso.
Verificando esta manhã, parece que agora é:
socket.close()
No meu caso, eu queria derrubar a conexão subjacente, caso em que tive que ligar, socket.disconnect(true)como você pode ver, é necessário da fonte aqui
Socket.io usa o padrão EventEmitter para desconectar / conectar / verificar os batimentos cardíacos para que você possa fazer isso. Client.emit('disconnect');
Isso não funcionou para mim:
`socket.disconnect()`
Isso funcionou para mim:
socket.disconnect(true)
A transferência truefechará a conexão subjacente com o cliente e não apenas o namespace que o cliente está conectado à documentação do Socket IO .
Um exemplo de caso de uso: o cliente se conectou ao servidor de soquete da web com token de acesso inválido (token de acesso entregue ao servidor de soquete da web com parâmetros de conexão). O servidor de soquete da Web notifica o cliente de que fechará a conexão por causa de seu token de acesso invá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');
// });
Estou usando client.emit('disconnect')+ client.removeAllListeners()para cliente conectado para ignorar todos os eventos após desconectar
Você pode fazer socket = undefined apagar qual soquete você conectou. Então quando quiser conectar faça socket (url)
Então vai ficar assim
const socketClient = require('socket.io-client');
let socket;
// Connect to server
socket = socketClient(url)
// When want to disconnect
socket = undefined;
Adicione novas conexões de soquete a uma matriz e, quando quiser fechar todas, faça um loop através delas e desconecte. (lado do 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();
});