2012-03-26 8 views
10

誰かがノードサーバーに接続すると、すべてのソケットを持つ配列が保持されます。 そのようにすれば、必要なときにいつでも誰にでもメッセージをブロードキャストできます。また、オンラインユーザーの数などをカウントするためにユーザーをループすることもできます。node.jsが切断イベントでソケットを送信しない

これはうまく動作しますが、切断イベントが発生すると、私の引数にソケットを受け取ります。 ソケットが切断されたばかりの別の方法がありますか?

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イベントはソケット引数(または他の引数)を与えないので、上記の例は機能しません。 ソケットがまだそこにある切断の前に別のイベントが発せられますか?

切断ハンドラが「接続」イベントのスコープ内で宣言されているため、アリ

答えて

22

は、あなたはすでに、ソケットを持っています。 'disconnect'ハンドラに渡すパラメータを削除してみると、接続ハンドラからsocketパラメータを操作できるはずです。

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

それとは別に、あなたはその部屋の中のすべてのソケットにグループソケットおよびブロードキャストに部屋を使用することができ、放送するためにソケットの配列を必要としません。

+0

クライアントからサーバーにデータを送信する必要がある場合は、1番目の方法で解決したような解決策はありませんか? –