Não consigo lidar com este evento de desconexão, não sei por que o soquete não é enviado para o cliente / cliente não responde!
Servidor
io.sockets.on('connection', function (socket) {
socket.on('NewPlayer', function(data1) {
online = online + 1;
console.log('Online players : ' + online);
console.log('New player connected : ' + data1);
Players[data1] = data1;
console.log(Players);
});
socket.on('DelPlayer', function(data) {
delete Players[data];
console.log(Players);
console.log('Adios' + data);
});
socket.on('disconnect', function () {
socket.emit('disconnected');
online = online - 1;
});
});
Cliente
var socket = io.connect('http://localhost');
socket.on('connect', function () {
person_name = prompt("Welcome. Please enter your name");
socket.emit('NewPlayer', person_name);
socket.on('disconnected', function() {
socket.emit('DelPlayer', person_name);
});
});
Como você pode ver, quando um cliente desconecta, o objeto Array [person_name] deve ser excluído, mas não
javascript
socket.io
disconnect
Raggaer
fonte
fonte
'disconnect'
vez de'disconnected'
?Respostas:
Ok, em vez de identificar jogadores por faixa de nome com os soquetes pelos quais eles se conectaram. Você pode ter uma implementação como
Servidor
var allClients = []; io.sockets.on('connection', function(socket) { allClients.push(socket); socket.on('disconnect', function() { console.log('Got disconnect!'); var i = allClients.indexOf(socket); allClients.splice(i, 1); }); });
Espero que isso ajude você a pensar de outra maneira
fonte
allClients.splice(i, 1)
para excluir um elemento.delete allClients[i]
irá apenas definir a posição da matriz paraundefined
i
obteve um valor de -1 todas as vezes. Você pode me dizer o que está acontecendo.allClients
array). Eu sugiro que você apenas retorne:if (i === -1)return;
antes de tentar emendá-lo.Para aqueles como @ sha1 se perguntando por que o código do OP não funciona -
A lógica do OP para excluir o player no lado do servidor está no manipulador do
DelPlayer
evento, e o código que emite esse evento (DelPlayer
) está nodisconnected
retorno de chamada do evento interno do cliente.O código do lado do servidor que emite este
disconnected
evento está dentro dodisconnect
retorno de chamada do evento que é disparado quando o soquete perde a conexão. Como o socket já perdeu a conexão, odisconnected
evento não chega ao cliente.A solução aceita executa a lógica no
disconnect
evento no lado do servidor, que é disparado quando o soquete é desconectado, portanto, funciona.fonte
Crie um mapa ou conjunto e, usando o evento "on connection" definido para cada soquete conectado, ao contrário do evento "uma vez desconectado", exclua esse soquete do mapa que criamos anteriormente
import * as Server from 'socket.io'; const io = Server(); io.listen(3000); const connections = new Set(); io.on('connection', function (s) { connections.add(s); s.once('disconnect', function () { connections.delete(s); }); });
fonte
Você também pode, se desejar, usar o ID de soquete para gerenciar sua lista de jogadores desta forma.
io.on('connection', function(socket){ socket.on('disconnect', function() { console.log("disconnect") for(var i = 0; i < onlineplayers.length; i++ ){ if(onlineplayers[i].socket === socket.id){ console.log(onlineplayers[i].code + " just disconnected") onlineplayers.splice(i, 1) } } io.emit('players', onlineplayers) }) socket.on('lobby_join', function(player) { if(player.available === false) return var exists = false for(var i = 0; i < onlineplayers.length; i++ ){ if(onlineplayers[i].code === player.code){ exists = true } } if(exists === false){ onlineplayers.push({ code: player.code, socket:socket.id }) } io.emit('players', onlineplayers) }) socket.on('lobby_leave', function(player) { var exists = false for(var i = 0; i < onlineplayers.length; i++ ){ if(onlineplayers[i].code === player.code){ onlineplayers.splice(i, 1) } } io.emit('players', onlineplayers) }) })
fonte