web-dev-qa-db-ja.com

socket.io 1.0で部屋のクライアントリストを取得する方法

Socket.io 0.9のこのコードで部屋のクライアントリストを取得できます。

io.sockets.clients(roomName)

Socket.io 1.0でこれを行うにはどうすればよいですか?

35
uzimith

質問に関する上記のコメントにリンクされている、このより完全な回答を検討してください: https://stackoverflow.com/a/24425207/1449799


部屋のクライアントは次の場所にあります

_io.nsps[yourNamespace].adapter.rooms[roomName]
_

これは、ソケットIDであるキーを持つ連想配列です。この場合、部屋のクライアント数を知りたいので、Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length

名前空間(このguy [me]など)を表示または使用していない場合は、ここでそれらについて学ぶことができます http://socket.io/docs/rooms-and-namespaces/(重要:デフォルトの名前空間は '/')

更新(特に@Zettamの場合):

このレポをチェックして、この動作を確認してください: https://github.com/thegreatmichael/socket-io-clients

36
Michael

@ ryan_Hdot link を使用して、コード内に小さな一時関数を作成しました。これにより、パッチの維持が回避されます。ここにあります :

_function getClient(roomId) {
  var res = [],
      room = io.sockets.adapter.rooms[roomId];
  if (room) {
    for (var id in room) {
      res.Push(io.sockets.adapter.nsp.connected[id]);
    }
  }
  return res;
}
_

名前空間を使用する場合:

_function getClient (ns, id) {
  return io.nsps[ns].adapter.rooms[id]
}
_

これは、io.sockets.clients(roomId)になるfindClientsSocketByRoomId(roomId)の一時的な修正として使用します。

編集:

ほとんどの場合、可能であればこの方法の使用を避けることを検討する価値があります。

私が今やっていることは、通常、クライアントを自分の部屋(つまり、clientIDという名前の部屋)に置くことです。この方法でコードが読みやすくなり、この回避策に頼る必要がなくなりました。

また、私はこれをRedisアダプターでテストしていません。

必要な場合は、名前空間を使用している場合は この関連する質問 も参照してください。

11
nha

名前空間を使用している人のために、異なる名前空間を処理できる関数も作成しました。 nhaの答えとまったく同じです。

function get_users_by_room(nsp, room) {
  var users = []
  for (var id in io.of(nsp).adapter.rooms[room]) {
    users.Push(io.of(nsp).adapter.nsp.connected[id]);
  };
  return users;
};
7
Depado

this github pull request を参照してトピックに関する議論を行うことができますが、SocketIOの1.0プレリリース候補からその機能が取り除かれたようです。

5
ryAn_Hdot

少なくとも1.4.5の時点で、nhaの方法も機能しなくなり、クライアントを部屋に入れるためのパブリックAPIはまだありません。ここに私のために働くものがあります。

io.sockets.adapter.rooms[roomId]は、ソケットと長さの2つのプロパティを持つオブジェクトを返します。 1つ目は、キーにsocketIdを使用し、値にブール値を使用する別のオブジェクトです。

Room {
   sockets: 
   { '/#vQh0q0gVKgtLGIQGAAAB': true,
     '/#p9Z7l6UeYwhBQkdoAAAD': true },
   length: 2 }

クライアントを取得するための私のコードは次のようになります。

var sioRoom = io.sockets.adapter.rooms[roomId];
if( sioRoom ) { 
  Object.keys(sioRoom.sockets).forEach( function(socketId){
    console.log("sioRoom client socket Id: " + socketId );
  }); 
}   
5
Tony