Socket.IO обработка события отключения
Не могу справиться с этим событием отключения, не знаю, почему сокет его не отправить клиенту / клиент не отвечает!
сервер
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;
});
});
клиент
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);
});
});
Как вы можете видеть, когда клиент отключается объекта Array[person_name] должен быть удален, но его не
3 ответов:
ОК, вместо идентификации игроков по имени трек с сокетами, через которые они подключились. Вы можете иметь реализацию, как
сервер
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); }); });надеюсь, что это поможет вам думать по-другому
для таких, как @sha1 интересно, почему код OP не работает -
логика OP для удаления игрока на стороне сервера находится в обработчике для
DelPlayerсобытие, и код, который выдает это событие (DelPlayer) находится внутриdisconnectedобратный вызов события клиента.код на стороне сервера, который выдает это
disconnectedсобытие находится внутриdisconnectобратный вызов события, который запускается, когда сокет теряет соединение. Так как сокет уже потерял связь,disconnectedсобытие не достигает клиент.
принятое решение выполняет логику на
disconnectсобытие на стороне сервера, которое запускается при отключении сокета, следовательно, работает.
import * as Server from 'socket.io'; const io = Server(); io.listen(3000); export const connections = new Map(); io.on('connection', function (c) { connections.set(c, c); c.once('disconnect', function () { connections.delete(c); }); });
Comments