Kann dieses Trennungsereignis nicht behandeln, weiß nicht, warum Socket nicht an den Client gesendet wird / Client antwortet nicht!
Server
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);
});
});
Wie Sie sehen können, sollte das Array-Objekt [person_name] gelöscht werden, wenn ein Client die Verbindung trennt, dies ist jedoch nicht der Fall
javascript
socket.io
disconnect
Raggaer
quelle
quelle
'disconnect'
statt sein'disconnected'
?Antworten:
Ok, anstatt Spieler anhand des Namens mit Sockeln zu identifizieren, über die sie eine Verbindung hergestellt haben. Sie können eine Implementierung wie haben
Server
Ich hoffe, dies wird Ihnen helfen, anders zu denken
quelle
allClients.splice(i, 1)
zum Löschen eines Elements verwenden.delete allClients[i]
wird nur die Array-Position aufundefined
i
jedes Mal der Wert -1 angegeben. Kannst du mir sagen, was los ist?allClients
Array registriert ). Ich schlage vor, Sie kehren einfach zurück:if (i === -1)return;
bevor Sie versuchen, es zu spleißen.Für diejenigen wie @ sha1, die sich fragen, warum der OP-Code nicht funktioniert -
Die Logik von OP zum Löschen des Players auf der Serverseite befindet sich im Handler für das
DelPlayer
Ereignis, und der Code, der dieses Ereignis (DelPlayer
)disconnected
ausgibt, befindet sich im Ereignisrückruf des Clients.Der serverseitige Code, der dies ausgibt
disconnected
Ereignis , befindet sich imdisconnect
Ereignisrückruf, der ausgelöst wird, wenn der Socket die Verbindung verliert. Da der Socket bereits die Verbindung verloren hat, erreicht dasdisconnected
Ereignis den Client nicht.Akzeptierte Lösung führt die Logik auf
disconnect
Ereignis auf der Serverseite aus, die ausgelöst wird, wenn der Socket getrennt wird, und funktioniert daher.quelle
Erstellen Sie eine Karte oder einen Satz und löschen Sie diesen Socket mithilfe des Ereignisses "Bei Verbindung", das für jeden verbundenen Socket festgelegt ist, in umgekehrter Reihenfolge "Einmal trennen" aus der zuvor erstellten Karte
quelle
Sie können auch, wenn Sie möchten, die Socket-ID verwenden, um Ihre Spielerliste wie folgt zu verwalten.
quelle