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, trennt ein Client das Array-Objekt[person_name] sollte gelöscht werden, ist es aber nicht.
Versuchen Sie es besser andersherum, löschen Sie zuerst den Player und trennen Sie dann die Verbindung. Denn sobald Sie die Verbindung zum Server getrennt haben, kann der Server das Ereignis, das der Client aussendet, nicht mehr empfangen. Verfolgen Sie eher den Sockel als den Spieler, wodurch Sie Spieler einfach entfernen können.
– Code-jaff
25. Juni 2013 um 11:20 Uhr
Wie soll ich den Player löschen und dann die Verbindung trennen? Woher weiß ich, wann der Player die Verbindung trennt?.
– Raggaer
25. Juni 2013 um 11:29 Uhr
sollte das event nicht auf dem client liegen 'disconnect' Anstatt von 'disconnected' ?
– Sherlock
6. Januar 2015 um 19:03 Uhr
@Sherlock im ursprünglichen Client-Code von OP versuchten sie, auf ein benutzerdefiniertes Ereignis zu hören, das sie serverseitig für getrennte Logik auslösten. „disconnect“ ist in der Tat das eingebaute Disconnect-Ereignis, aber es trägt nicht direkt zu dem Problem bei, das sie erleben.
– Jon Kirche
24. Mai 2018 um 12:40 Uhr
Code-jaff
Ok, anstatt Spieler nach Namen zu identifizieren, verfolgen Sie die Steckdosen, über die sie sich verbunden haben. Sie können eine Implementierung wie haben
Server
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);
});
});
Ich hoffe, das hilft Ihnen, anders zu denken
Besser verwenden allClients.splice(i, 1) um ein Element zu löschen. delete allClients[i] setzt nur die Array-Position auf undefined
– Yves
21. November 2013 um 15:47 Uhr
Warum funktioniert es, aber die Lösung zum Verfolgen von Personen mit ihren Namen funktioniert nicht?
– sha1
10. Juni 2014 um 19:11 Uhr
Das funktioniert bei mir nicht. Hier i bekam jedes Mal einen Wert von -1. Können Sie mir sagen, was los ist.
– Vinit Chouhan
17. Februar 2015 um 22:44 Uhr
@VinitChouhan Sie sollten wahrscheinlich eine separate Frage zu Ihrem eigentlichen Problem stellen.
– Code-jaff
18. Februar 2015 um 3:52 Uhr
Wenn Sie einen Wert von -1 erhalten, bedeutet dies, dass Sie versuchen, einen Socket zu spleißen, der nicht existiert (jemand trennt die Verbindung, aber Sie haben die Person noch nicht in Ihrem registriert allClients Reihe). Ich schlage vor, Sie kehren einfach zurück: if (i === -1)return; bevor Sie versuchen, es zu spleißen.
– Koeno
13. Juni 2016 um 14:21 Uhr
Für diejenigen wie @sha1, die sich fragen, warum der Code des OP nicht funktioniert –
Die Logik von OP zum Löschen von Spielern auf der Serverseite befindet sich im Handler für DelPlayer Ereignis und den Code, der dieses Ereignis ausgibt (DelPlayer) ist drinnen disconnected Ereignisrückruf des Clients.
Der serverseitige Code, der dies ausgibt disconnected Ereignis ist innerhalb der disconnect Ereignisrückruf, der ausgelöst wird, wenn der Socket die Verbindung verliert. Da die Steckdose bereits die Verbindung verloren hat, disconnected Das Ereignis erreicht den Client nicht.
Akzeptierte Lösung führt die Logik weiter aus disconnect Ereignis auf der Serverseite, das ausgelöst wird, wenn der Socket die Verbindung trennt, funktioniert daher.
Alexander Mills
Erstellen Sie eine Map oder ein Set, und verwenden Sie das Ereignis “on connection”, um jeden verbundenen Socket festzulegen, und löschen Sie im umgekehrten Fall das Ereignis “once disconnect” diesen Socket aus der zuvor erstellten Map
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);
});
});
Sie können auch, wenn Sie möchten, die Socket-ID verwenden, um Ihre Spielerliste wie folgt zu verwalten.
Versuchen Sie es besser andersherum, löschen Sie zuerst den Player und trennen Sie dann die Verbindung. Denn sobald Sie die Verbindung zum Server getrennt haben, kann der Server das Ereignis, das der Client aussendet, nicht mehr empfangen. Verfolgen Sie eher den Sockel als den Spieler, wodurch Sie Spieler einfach entfernen können.
– Code-jaff
25. Juni 2013 um 11:20 Uhr
Wie soll ich den Player löschen und dann die Verbindung trennen? Woher weiß ich, wann der Player die Verbindung trennt?.
– Raggaer
25. Juni 2013 um 11:29 Uhr
sollte das event nicht auf dem client liegen
'disconnect'
Anstatt von'disconnected'
?– Sherlock
6. Januar 2015 um 19:03 Uhr
@Sherlock im ursprünglichen Client-Code von OP versuchten sie, auf ein benutzerdefiniertes Ereignis zu hören, das sie serverseitig für getrennte Logik auslösten. „disconnect“ ist in der Tat das eingebaute Disconnect-Ereignis, aber es trägt nicht direkt zu dem Problem bei, das sie erleben.
– Jon Kirche
24. Mai 2018 um 12:40 Uhr