2017-08-02 9 views
1

どのようにsocket.io 2.02.0 socket.io取得接続されたクライアントは、


を使用して部屋内のすべての接続されたクライアントを取得することができます私はすでに同様の問題の解決策を試してみました:https://stackoverflow.com/a/45160538/2189845

var sockets = io.in("room_name") 
Object.keys(sockets.sockets).forEach((item) => { 
console.log("TODO: Item:", sockets.sockets[item].id)    
}) 

しかし、これは部屋に関係なく、すべてのソケット接続をループします。

Object.keys(io.sockets.sockets).forEach((item) => { 
    console.log("general socket: Item:", item); 
}); 

答えて

0

残念ながら、この答えは完全にのOPの質問を満たしていません。あなたはソケット接続を管理するためにsocket.io-redisを使用している場合は、この投稿がある

io.of('/').adapter.clients((err, clients) => { 
    console.log(clients); // an array containing all connected socket ids 
}); 

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => { 
    console.log(clients); // an array containing socket ids in 'room1' and/or 'room2' 
}); 

// you can also use 

io.in('room3').clients((err, clients) => { 
    console.log(clients); // an array containing socket ids in 'room3' 
}); 

と同じように、接続されたクライアントを取得することができます:https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

+1

これはうまくいくので、これを正しい答えとして受け入れました。あなたは1つのノードサーバーを実行するとき、それは過度のように感じる..あなたは接続されたクライアントのリストを持つためだけに余分なredisサーバーを実行する必要があります。もっと簡単な解決策があることを願っていますが、私はこの問題に取り組んでいきます。私たちは、複数のノードサーバーにアップスケールする準備をしています。 –

+0

どのようにして、ソケットIDを持つユーザー情報を追跡していますか? redisキー値のペアを使用することはできますが、サーバーが再起動してクライアントが再接続すると、新しいソケットIDが作成され、古いものが残ったままになり、メモリリークが発生します。 – Koder

0

試してみてください:

io.sockets.clients('room_name').forEach(function(item) { 
    console.log(item.id);//any property of socket you want to print 
}); 

それともあなたは試みることができる:だから上記のコードは同じ結果が得られる

var clients = io.sockets.adapter.rooms['room_name'].sockets; 
for (var clientId in clients) { 

    //this is the socket of each client in the room. 
    var SocketofClient = io.sockets.connected[clientId]; 
    console.log(SocketofClient.id); 
} 
+2

者2.0にもはや有効ではありません。 'TypeError:fn.bindは関数ではありません'というメッセージが最初に表示され、 'TypeError:2番目のソリューションでは'未定義のプロパティ 'ソケット'を読み取れません。 –

関連する問題