103

この切断イベントを処理できません。ソケットがクライアントに送信されない理由がわかりません / クライアントが応答しません!

サーバ

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;

  });

});

クライアント

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

        });

    });

ご覧のとおり、クライアントが切断したときに配列オブジェクト [person_name] を削除する必要がありますが、そうではありません。

4

4 に答える 4

191

わかりました、プレーヤーを名前トラックで識別する代わりに、プレーヤーが接続したソケットを使用します。次のような実装を持つことができます

サーバ

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

これがあなたが別の方法で考えるのに役立つことを願っています

于 2013-06-26T04:41:07.153 に答える
28

OPのコードが機能しない理由を疑問に思っている@sha1のような人のために-

サーバー側でプレーヤーを削除するための OP のロジックは、イベントのハンドラーにDelPlayerあり、このイベント ( DelPlayer)を発行するコードはdisconnected、クライアントのイベント コールバック内にあります。

このイベントを発行するサーバー側のコードは、ソケットが接続を失ったときに発生disconnectedするイベント コールバック内にあります。disconnectソケットはすでに接続を失っているため、disconnectedイベントはクライアントに届きません。


受け入れられたソリューションはdisconnect、ソケットが切断されたときに起動されるサーバー側のイベントでロジックを実行するため、機能します。

于 2015-11-24T11:23:06.057 に答える
1

必要に応じて、ソケット ID を使用してプレーヤー リストを次のように管理することもできます。

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)
  })
})
于 2019-12-22T14:56:55.590 に答える