Socket.IO behandelt das Trennungsereignis

Lesezeit: 4 Minuten

Benutzer-Avatar
Raggaer

Kann dieses Trennungsereignis nicht verarbeiten, weiß nicht, warum der Socket nicht an den Client gesendet wird / der 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, 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


Benutzer-Avatar
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.

Benutzer-Avatar
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.

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)
  })
})

1205890cookie-checkSocket.IO behandelt das Trennungsereignis

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy