Подтвердить что ты не робот

Как перечислить номера на сервере socket.io nodejs

после проделанной работы над вопросом как создать многоадресные группы socket.io, я нашел, что делает комнаты отличным способом делать то, что мне нужно.

Однако было бы замечательно знать обо всех комнатах без дополнительной структуры данных.

Можно ли получить список всех комнат на сервере из серверного сокета?

4b9b3361

Ответ 1

Короткий ответ:

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' ] }

Ответ 2

В новой версии socket.io(1.x), io.sockets.manager.rooms приведет к ошибке. Вместо этого следует использовать io.sockets.adapter.rooms.

Ответ 3

Как сказали все, в новой версии 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;
}

Это было чем-то сбивающим с толку для меня, надеюсь, что это поможет!

Ответ 4

если вы используете

socket.io 2.1.0

и случайно на это.

в 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': Комната {сокеты: {'0Ak9nTjme7bLs}} 1, длина )A

Ответ 5

Если io.sockets.adapter - undefined..

Я использую socket.io 1.7.1 (Server).

Кажется, что io.of("......").sockets.adapter есть undefined в этой версии socket.io. Поэтому я использовал io.adapter.rooms, и он работает.

Ответ 6

Мне удалось найти их с помощью socket._events в открытом соединении.

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

Вывод:

{
  ping: [Function],
  disconnect: [Function]
}

Ответ 7

В 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 
   } 
}

Ответ 8

У меня недостаточно репутации, чтобы оставить свой комментарий к исходному вопросу, но, кроме того, если вы хотите перечислить все комнаты в пространстве имен, это должно быть закодировано следующим образом:

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

var rooms = nsp.adapter.rooms;

Это поможет, если клиент присоединится к комнате:

socket.join('my-room');

Вы должны быть в состоянии увидеть название вашей комнаты, когда вы делаете console.log(rooms);

Я просто хочу ответить на оставленный без ответа комментарий выше, так как столкнулся с той же проблемой после того, как увидел несоответствующие названия комнат.

Ответ 9

Object.keys(io.sockets.adapter.rooms)

используйте это, чтобы получить все комнаты.