web-dev-qa-db-ja.com

socket.io nodejsサーバーの部屋を一覧表示する方法

質問 socket.ioマルチキャストグループを作成する方法 の進行後、部屋を作ることは私が必要とすることを行うための素晴らしい方法であることがわかりました。

ただし、追加のデータ構造なしに、すべての部屋について知っておくと便利です。

サーバーソケットからサーバー上のすべての部屋のリストを取得することは可能ですか?

31
pyramation

短い答え:

io.sockets.adapter.rooms

私はioを分析しました:

次の出力が得られました。

{ server: 
   { stack: 
      [ [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object] ],
     connections: 3,
     allowHalfOpen: true,
     watcher: { Host: [Circular], callback: [Function] },
     _events: 
      { request: [Function],
        connection: [Function: connectionListener],
        listening: [Object],
        upgrade: [Object] },
     httpAllowHalfOpen: false,
     cache: {},
     settings: { home: '/', env: 'development', hints: true },
     redirects: {},
     isCallbacks: {},
     _locals: { settings: [Object], app: [Circular] },
     dynamicViewHelpers: {},
     errorHandlers: [],
     route: '/',
     routes: 
      { app: [Circular],
        routes: [Object],
        params: {},
        _params: [],
        middleware: [Function] },
     router: [Getter],
     __usedRouter: true,
     type: 'tcp4',
     fd: 7 },
  namespaces: 
   { '': 
      { manager: [Circular],
        name: '',
        sockets: [Object],
        auth: false,
        flags: [Object],
        _events: [Object] } },
  sockets: 
   { manager: [Circular],
     name: '',
     sockets: { '210837319844898486': [Object] },
     auth: false,
     flags: { endpoint: '', exceptions: [] },
     _events: { connection: [Function] } },
  settings: 
   { origins: '*:*',
     log: true,
     store: 
      { options: undefined,
        clients: [Object],
        manager: [Circular] },
     logger: { colors: true, level: 1 },
     heartbeats: true,
     resource: '/socket.io',
     transports: 
      [ 'websocket',
        'htmlfile',
        'xhr-polling',
        'jsonp-polling' ],
     authorization: [Function],
     'log level': 1,
     'close timeout': 25,
     'heartbeat timeout': 15,
     'heartbeat interval': 20,
     'polling duration': 20,
     'flash policy server': true,
     'flash policy port': 843,
     'destroy upgrade': true,
     'browser client': true,
     'browser client minification': false,
     'browser client etag': false,
     'browser client handler': false,
     'client store expiration': 15 },
  handshaken: 
   { '210837319844898486': 
      { headers: [Object],
        address: [Object],
        time: 'Mon Jul 18 2011 00:53:27 GMT+0200 (CEST)',
        xdomain: false,
        secure: undefined,
        PHPSESSID: '7qo6cht3q0rskhfes4eesb2d05' } },
  connected: { '210837319844898486': true },
  open: { '210837319844898486': true },
  closed: {},
  closedA: [],
  rooms: 
   { '': [ '210837319844898486' ],
     '/public-alfred': [ '210837319844898486' ] },
  roomClients: { '210837319844898486': [ '': true, '/public-alfred': true ] },
  oldListeners: [ [Function] ],
  _events: 
   { 'set:origins': [Function],
     'set:flash policy port': [Function],
     'set:transports': [Function] } }

単一のクライアントから「public-alfred」ルームに参加した後io.sockets.adapter.rooms含まれる:

 { '': [ '210837319844898486' ],
         '/public-alfred': [ '210837319844898486' ] }
37
Alfred

新しいバージョンのsocket.io(1.x)では、io.sockets.manager.roomsはエラーを引き起こします。代わりにio.sockets.adapter.roomsを使用してください。

16
Salvador Dali

みんなが言ったように、socket.io(1.x)の新しいバージョンでは、部屋は次の場所にあります。

    io.sockets.adapter.rooms

これは次のようなものを返します:

{ 
    'qNADgg3CCxESDLm5AAAA': [ 'qNADgg3CCxESDLm5AAAA': true ],
    'myRoom': [ 'qNADgg3CCxESDLm5AAAA': true,
                '0rCX3v4pufWvQ6uwAAAB': true,
                'iH0wJHGh-qKPRd2RAAAC': true ],  
    '0rCX3v4pufWvQ6uwAAAB': [ '0rCX3v4pufWvQ6uwAAAB': true ],  
    'iH0wJHGh-qKPRd2RAAAC': [ 'iH0wJHGh-qKPRd2RAAAC': true ] 
}

取得したい部屋は「myRoom」だけなので、それを行うために次の関数を書きました。

function findRooms() {
    var availableRooms = [];
    var rooms = io.sockets.adapter.rooms;
    if (rooms) {
        for (var room in rooms) {
            if (!rooms[room].hasOwnProperty(room)) {
                availableRooms.Push(room);
            }
        }
    }
    return availableRooms;
}

これは私を混乱させるようなものでした、これが役に立てば幸いです!

13
gastonmancini

あなたが使用している場合

socket.io 2.1.

そして偶然これ。

2.1.0では、サーバーのすべての部屋は変数io.sockets.adapter.roomsにあります。

//Use Example//

sockets.on('getRooms', function() {
    sockets.emit('rooms', io.sockets.adapter.rooms);
});

次の結果が得られます。

{xqfGuWYkKzT9hGgGAAAB:ルーム{ソケット:{xqfGuWYkKzT9hGgGAAAB:true}、長さ:1}、 '0Ak9nTjme7bLsD8NAAAC':ルーム{ソケット:{'0Ak9nTjme7BL長さ:}} NA}の長さ:}

3
Someone Special

SocketIOバージョン2.2.0では、

  • io.sockets.managerは存在しません

次の3を使用して、特定の部屋のすべてのソケットを取得できます。

socket.adapter.rooms;
io.sockets.adapter.rooms
io.sockets.adapter.sids

名前空間を使用している場合は、socket.adapter.roomsを使用して部屋リストを取得する必要があります。

{ '/userSocket#oXorUiql1GF68dbTAAAB':
   Room {
     sockets: { '/userSocket#oXorUiql1GF68dbTAAAB': true },
     length: 1 
     },
  roomOneName:
   Room {
     sockets: { '/userSocket#oXorUiql1GF68dbTAAAB': true },
     length: 1 
     },
  roomTwoName:
   Room {
     sockets: { '/userSocket#oXorUiql1GF68dbTAAAB': true },
     length: 1 
   } 
}
3
Md Alamin

_io.sockets.adapter_がundefined ..の場合.

socket.io 1.7.1(Server)を使用しています。

そのバージョンの_socket.io_ではio.of("......").sockets.adapterundefinedのようです。そのため、代わりに_io.adapter.rooms_を使用しましたが、機能します。

開いている接続でsocket._eventsを使用してそれらを見つけることができました。

io.sockets.on('connection', function(socket){
  socket.on('ping', function(data){
    console.log(socket._events);
  });
});

出力:

{
  ping: [Function],
  disconnect: [Function]
}
1
Michael
Object.keys(io.sockets.adapter.rooms)

これを使用してすべての部屋を取得します。

1
Ahmad Ali

元の質問にコメントを投稿するのに十分な評判がありませんが、さらに、名前空間内のすべての部屋を一覧表示する場合は、次のようにコーディングする必要があります。

_var nsp = io.of('/my-nsp');

var rooms = nsp.adapter.rooms;
_

これは、クライアントが次の方法でルームに参加する場合に役立ちます。

_socket.join('my-room');
_

console.log(rooms);を実行すると、部屋の名前が表示されます。

部屋の名前が一致していないのを見た後、同じ問題に遭遇したので、上記の未回答のコメントに答えたいだけです。

0
conchimnon
function ActiveRooms(){
        var activeRooms = [];
        Object.keys(io.sockets.adapter.rooms).forEach(room=>{
            var isRoom = true;
            Object.keys(io.sockets.adapter.sids).forEach(id=>{
                isRoom = (id === room)? false: isRoom;
            });
            if(isRoom)activeRooms.Push(room);
        });
        return activeRooms;}
0
Jay Stratemeyer