Socket.IO işleme bağlantı kesme olayı


90

Bu bağlantı kesme olayını halledemiyorum, neden soketin istemciye gönderilmediğini bilmiyorum / istemciye yanıt vermiyor!

Sunucu

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;

  });

});

Müşteri

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

        });

    });

Gördüğünüz gibi, bir istemci Array nesnesinin [person_name] bağlantısını kestiğinde silinmeli, ancak silinmemelidir.


Başka bir yol deneseniz iyi olur, önce oynatıcıyı silin sonra bağlantısını kesin. Çünkü sunucuyla bağlantınızı kestiğinizde sunucu, istemcinin yayınladığı olayı alamayacaktır. Oyuncuları kolayca çıkarabileceğiniz oynatıcı yerine soketi takip edin.
code-jaff

Oynatıcıyı nasıl silmeli ve sonra bağlantısını nasıl kesmeliyim? oyuncunun bağlantısının ne zaman kesileceğini nasıl anlarım?
Raggaer

4
müşterideki olay 'disconnect'yerine olmamalı 'disconnected'mı?
Sherlock

1
OP'nin orijinal istemci kodundaki @Sherlock, bağlantısız mantık için sunucu tarafında tetikledikleri özel bir olayı dinlemeye çalışıyorlardı. 'bağlantı kesme' aslında yerleşik bağlantı kesme olayıdır, ancak yaşadıkları soruna doğrudan katkıda bulunmaz.
Jon Kilisesi

Yanıtlar:


173

Tamam, oyuncuları adlarına göre tanımlamak yerine bağlandıkları soketlerle takip edin. Gibi bir uygulamaya sahip olabilirsiniz

Sunucu

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

Umarım bu başka bir şekilde düşünmenize yardımcı olur


92
allClients.splice(i, 1)Bir öğeyi silmek için daha iyi kullanın . delete allClients[i]dizi konumunu şu şekilde ayarlayacakundefined
Yves

1
Neden işe yarıyor, ancak insanları isimleriyle izleme çözümü çalışmıyor?
sha1

Bu benim için çalışmıyor. Burada iher seferinde -1 değeri var. Bana neler olduğunu anlatır mısın?
Vinit Chouhan

1
@VinitChouhan muhtemelen asıl sorununuzla ilgili ayrı bir soru sormalısınız.
code-jaff

-1 değerini aldığınızda, var olmayan bir soketi eklemeye çalıştığınız anlamına gelir (birisi bağlantıyı keser, ancak kişiyi henüz allClientsdizinize kaydetmediniz ). Sadece geri dönmenizi öneririm: if (i === -1)return;eklemeyi denemeden önce.
Koen

23

@ Sha1 gibi OP'nin kodunun neden çalışmadığını merak edenler için -

OP'nin sunucu tarafındaki oyuncuyu silme mantığı DelPlayerolay için işleyicide ve bu olayı ( DelPlayer) yayan kod içeridedisconnected , istemcinin olay geri aramasında bulunur.

Bunu yayan sunucu tarafı kodu disconnected olayıdisconnect , yuva bağlantıyı kaybettiğinde tetiklenen olay geri çağrısının içindedir . Soket zaten bağlantıyı kaybettiğinden, disconnectedolay istemciye ulaşmaz.


Kabul edilen çözüm disconnect, sunucu tarafındaki olayda mantık yürütür , bu da soket bağlantısı kesildiğinde tetiklenir, dolayısıyla çalışır.


6

Bir Harita veya Küme oluşturun ve her bağlı sokete "bağlantıda" olay setini kullanarak, tersine "bir kez bağlantı kes" olayını kullanarak bu soketi daha önce oluşturduğumuz Haritadan silin

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

});

1
Bir gazinin açıklamaları ve yorumlarıyla ayrıntılı bir cevap beklenir, ancak sanırım sadece bir grup kodla halletmemiz gerekiyor
Cemal

Sorularınız varsa bana bildirin, cevabı yazdığımı hatırlamıyorum
Alexander Mills

1
Aslında hiçbir sorum yok. Bu, herhangi birinin (en azından en azından) sizi rahatsız etmeden örneğinizi anlamasına izin vermek için yorum kullanmayı ve bir cevaba açıklama yerleştirmeyi daha iyi bilen bir yazar için yapıcı bir eleştiriydi. Neyse, mutlu
Cemal

0

Ayrıca, oyuncu listenizi bu şekilde yönetmek için soket kimliğini kullanmayı da tercih edebilirsiniz.

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)
  })
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.