Nie mogę obsłużyć tego zdarzenia rozłączenia, nie wiem, dlaczego gniazdo nie jest wysyłane do klienta / klienta nie odpowiada!
serwer
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;
});
});
Klient
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);
});
});
Jak widać, gdy klient rozłącza się, obiekt Array [person_name] powinien zostać usunięty, ale tak nie jest
javascript
socket.io
disconnect
Raggaer
źródło
źródło
'disconnect'
zamiast tego'disconnected'
?Odpowiedzi:
Ok, zamiast identyfikować graczy po nazwie toru z gniazdami, przez które się połączyli. Możesz mieć taką implementację
serwer
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); }); });
Mam nadzieję, że pomoże ci to myśleć w inny sposób
źródło
allClients.splice(i, 1)
do usunięcia elementu.delete allClients[i]
po prostu ustawi pozycję tablicy naundefined
i
za każdym razem otrzymano wartość -1. Czy możesz mi powiedzieć, co się dzieje.allClients
tablicy). Proponuję po prostu wrócić:if (i === -1)return;
przed próbą połączenia.Dla takich jak @ sha1 zastanawiających się, dlaczego kod OP nie działa -
Logika OP do usuwania gracza po stronie serwera znajduje się w module obsługi
DelPlayer
zdarzenia, a kod, który emituje to zdarzenie (DelPlayer
), znajduje się w wewnętrznymdisconnected
wywołaniu zwrotnym zdarzenia klienta.Kod po stronie serwera, który emituje to
disconnected
zdarzenie, znajduje się wdisconnect
wywołaniu zwrotnym zdarzenia, które jest uruchamiane, gdy gniazdo traci połączenie. Ponieważ gniazdo już utraciło połączenie,disconnected
zdarzenie nie dociera do klienta.Zaakceptowane rozwiązanie wykonuje logikę na
disconnect
zdarzenie po stronie serwera, które jest uruchamiane w momencie rozłączenia gniazda, dzięki czemu działa.źródło
Utwórz mapę lub zestaw i używając zdarzenia „on connection” ustawionego dla każdego połączonego gniazda, w odwrotnej kolejności zdarzenie „Once rozłącz” usuń to gniazdo z utworzonej wcześniej mapy
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); }); });
źródło
Możesz także, jeśli chcesz, użyć identyfikatora gniazda do zarządzania listą graczy w ten sposób.
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) }) })
źródło