web-dev-qa-db-ja.com

切断イベントを処理するSocket.IO

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

サーバ

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

        });

    });

クライアントが切断したときにわかるように、Arrayオブジェクト[person_name]は削除する必要がありますが、

73
Raggaer

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

サーバ

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

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

146
code-jaff

@ sha1のような人は、OPのコードがなぜ機能しないのか疑問に思う-

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

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


承認されたソリューションは、サーバー側でdisconnectイベントのロジックを実行します。これは、ソケットが切断されると起動するため、動作します。

14
T J

マップまたはセットを作成し、接続された各ソケットに設定された「on connection」イベントを使用して、逆に「once disconnect」イベントで、先ほど作成したマップからそのソケットを削除します

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
Alexander Mills