web-dev-qa-db-fra.com

comment lister les salles sur le serveur socket.io nodejs

après avoir progressé sur la question comment créer des groupes multicast socket.io , j’ai trouvé dans la création de salles un excellent moyen de faire ce dont j'avais besoin.

Cependant, il serait bon de connaître toutes les salles, sans une structure de données supplémentaire.

Est-il possible d'obtenir une liste de toutes les pièces du serveur à partir du socket du serveur?

28
pyramation

La réponse courte:

io.sockets.adapter.rooms

J'ai analysé io:

J'ai la sortie suivante:

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

après avoir rejoint la salle "public-alfred" d'un seul client io.sockets.adapter.rooms contenait:

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

Dans une nouvelle version de socket.io (1.x), io.sockets.manager.rooms provoquera une erreur. Vous devriez utiliser io.sockets.adapter.rooms à la place.

16
Salvador Dali

Comme tout le monde l’a dit, dans une nouvelle version de socket.io (1.x), les salles se trouvent à l’adresse suivante:

    io.sockets.adapter.rooms

Cela retournera quelque chose comme:

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

La seule pièce que je souhaite obtenir est "myRoom", j'ai donc écrit la fonction suivante pour le faire:

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

C'était un peu déroutant pour moi, espérons que cela aide!

12
gastonmancini

au cas où vous utiliseriez 

socket.io 2.1.0  

et par hasard sur cela.

en 2.1.0, toutes les salles du serveur sont situées dans la variable io.sockets.adapter.rooms

//Use Example//

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

Vous obtiendrez les résultats suivants.

{xqfGuWYkKzT9hGgGAAAB: Salle {sockets: {xqfGuWYkKzT9hGgGAAAB: true }, longueur: 1}, '0Ak9nTjme7bLsD8NAAAC': Salle {sockets: { '0Ak9nTjme7bLsD8NAAAC': true}, longueur: 1}}

3
Someone Special

Si io.sockets.adapter est undefined ..

J'utilise socket.io 1.7.1 (Serveur) .

Il semble que io.of("......").sockets.adapter est undefined sur cette version de socket.io. J'ai donc utilisé io.adapter.rooms à la place et cela fonctionne.

Dans socketIO version 2.2.0,

  • io.sockets.manager n'existe plus

Vous pouvez obtenir toutes les prises dans une pièce spécifique en utilisant les éléments suivants 3.

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

Si vous utilisez un espace de noms, vous devez utiliser socket.adapter.rooms pour obtenir les listes de salles.

{ '/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 
   } 
}
2
Md Alamin

Je n'ai pas assez de réputation pour poster mon commentaire sur la question initiale, mais en outre, si vous souhaitez répertorier toutes les pièces d'un espace-noms, vous devez le coder comme suit:

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

var rooms = nsp.adapter.rooms;

Cela aiderait si un client rejoint une salle par:

socket.join('my-room');

Vous devriez être capable de voir le nom de votre pièce quand vous faites console.log(rooms);

Je veux juste répondre à un commentaire sans réponse ci-dessus car j'ai rencontré le même problème après avoir vu des noms de chambre mal assortis.

1
conchimnon

J'ai pu les trouver en utilisant socket._events sur une connexion ouverte.

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

Sortie:

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

utilisez-le pour obtenir toutes les chambres. 

0
Ahmad Ali