如何在socket.io nodejs服务器上列出房间

pyr*_*ion 30 multicast node.js socket.io

在关于如何创建socket.io组播组的问题上取得进展后,我发现制作房间是一种很好的方式来完成我需要的工作.

但是,如果没有额外的数据结构,了解所有房间会很棒.

是否可以从服务器套接字获取服务器上所有房间的列表?

Alf*_*red 37

简短的回答:

io.sockets.adapter.rooms
Run Code Online (Sandbox Code Playgroud)

我分析说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] } }
Run Code Online (Sandbox Code Playgroud)

从一个客户加入房间"public-alfred"后,io.sockets.adapter.rooms包含:

 { '': [ '210837319844898486' ],
         '/public-alfred': [ '210837319844898486' ] }
Run Code Online (Sandbox Code Playgroud)

  • 甚至更简单,`io.rooms`的工作原理是`io.sockets.manager`是一个循环引用.他们会给你同样的东西,只是`io.rooms`不那么冗长. (5认同)
  • @Alfred,我使用的是1.4.x版.如何获取`io.sockets.adapters.rooms`中每个房间的房间名称?当我创建一个房间并加入时,我会给它分配一个名称,如`socket.join('someRoom')`,但是当我使用`io.sockets.adapters.rooms`时,我得到一个像`/#4Ps4Ql-的引用bx2R3qFH6AAAC`.我如何获得相应的名称? (4认同)
  • 简单的`socket.rooms`现在可以解决问题..必须喜欢进步;) (3认同)
  • 我认为这不适用于 socket.io 版本 1.0。或许?`io.nsps['/'].adapter.rooms` (2认同)
  • 阿尔弗雷德,我编辑了两个 API 版本的答案,有潜在读者仍然像我一样使用 9.x :) (2认同)

Sal*_*ali 16

在socket.io(1.x)的新版本中,io.sockets.manager.rooms将导致错误.你应该使用io.sockets.adapter.rooms.


gas*_*ini 15

正如大家所说,在socket.io(1.x)的新版本中,房间可以在以下位置找到:

    io.sockets.adapter.rooms
Run Code Online (Sandbox Code Playgroud)

这将返回如下内容:

{ 
    'qNADgg3CCxESDLm5AAAA': [ 'qNADgg3CCxESDLm5AAAA': true ],
    'myRoom': [ 'qNADgg3CCxESDLm5AAAA': true,
                '0rCX3v4pufWvQ6uwAAAB': true,
                'iH0wJHGh-qKPRd2RAAAC': true ],  
    '0rCX3v4pufWvQ6uwAAAB': [ '0rCX3v4pufWvQ6uwAAAB': true ],  
    'iH0wJHGh-qKPRd2RAAAC': [ 'iH0wJHGh-qKPRd2RAAAC': true ] 
}
Run Code Online (Sandbox Code Playgroud)

我想要的唯一房间是'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;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说有点困惑,希望这会有所帮助!


Md *_*min 6

在socketIO版本2.2.0中,

  • io.sockets.manager 不存在了

您可以使用以下 3 获取特定房间中的所有插座。

套接字.适配器.房间;
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 
   } 
}
Run Code Online (Sandbox Code Playgroud)