Не могу обработать это событие отключения, не знаю, почему сокет не отправляется клиенту / клиенту не отвечает!
Сервер
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);
});
});
Как видите, когда клиент отключает, объект массива [person_name] должен быть удален, но не
javascript
socket.io
disconnect
Raggaer
источник
источник
'disconnect'
вместо'disconnected'
?Ответы:
Хорошо, вместо того, чтобы идентифицировать игроков по имени, следите за сокетами, через которые они подключились. У вас может быть такая реализация, как
Сервер
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); }); });
Надеюсь, это поможет вам думать по-другому
источник
allClients.splice(i, 1)
для удаления элемента.delete allClients[i]
просто установит позицию массива наundefined
i
каждый раз получалось значение -1. Вы можете сказать мне, что происходит?allClients
массиве). Я предлагаю вам просто вернуться:if (i === -1)return;
прежде чем пытаться его склеить.Для тех, кто вроде @ sha1 задается вопросом, почему код OP не работает -
Логика OP для удаления игрока на стороне сервера находится в обработчике
DelPlayer
события, а код, который генерирует это событие (DelPlayer
), находится в обратномdisconnected
вызове внутреннего события клиента.Код на стороне сервера, который генерирует это
disconnected
событие, находится внутриdisconnect
обратного вызова события, который запускается, когда сокет теряет соединение. Поскольку сокет уже потерял соединение,disconnected
событие не доходит до клиента.Принятое решение выполняет логику
disconnect
события на стороне сервера, которое запускается, когда сокет отключается, следовательно, работает.источник
Создайте карту или набор и, используя событие «при подключении», установите для него каждый подключенный сокет, в обратном случае событие «после отключения» удалите этот сокет из карты, которую мы создали ранее.
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); }); });
источник
Вы также можете, если хотите, использовать идентификатор сокета для управления списком игроков следующим образом.
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) }) })
источник