10

誰かがノードサーバーに接続するとき、私はすべてのソケットを含む配列を保持します。そうすれば、必要なときにいつでも全員にメッセージをブロードキャストしたり、ユーザーをループしてオンラインユーザーの数を数えたりすることができます。

これはすべて正常に機能しますが、on切断イベントが発生すると、引数にソケットがありません。どのソケットが切断されたかを知る別の方法はありますか?

var allClients = [];

io.sockets.on('connection', function(socket) {
   allClients.push(socket);

   socket.on('disconnect', function(socket) {
      console.log('Got disconnect!');

      var i = allClients.indexOf(socket);
      delete allClients[i];
   });
});

もちろん、上記の例は機能しません。これは、disconnectイベントがソケット引数(またはその他の引数)を提供しないためです。それで、ソケットがまだそこにある切断の前に発生した別のイベントはありますか?

アリ

4

1 に答える 1

25

切断ハンドラーは「接続」イベントスコープ内で宣言されているため、すでにソケットがあります。'disconnect'ハンドラーに渡すパラメーターを削除してみてください。接続ハンドラーからソケットパラメーターを操作できるはずです。

io.sockets.on('connection', function(socket) {
   allClients.push(socket);

   socket.on('disconnect', function() {
      console.log('Got disconnect!');

      var i = allClients.indexOf(socket);
      delete allClients[i];
   });
});

それとは別に、ブロードキャストするためにソケットアレイは必要ありません。部屋を使用してソケットをグループ化し、その部屋内のすべてのソケットにブロードキャストできます。

于 2012-03-26T08:37:59.643 に答える