web-dev-qa-db-de.com

wie man Räume auf dem socket.io nodejs Server auflistet

nach dem Fortschritt bei der Frage wie man Socket.io-Multicast-Gruppen erstellt, fand ich das Erstellen von Räumen eine gute Möglichkeit, das zu tun, was ich brauchte.

Es wäre jedoch großartig, alle Räume ohne eine zusätzliche Datenstruktur zu kennen.

Kann eine Liste aller Räume auf dem Server vom Serversockel abgerufen werden?

28
pyramation

Die kurze Antwort:

io.sockets.adapter.rooms

Ich habe io analysiert:

Ich habe folgende Ausgabe erhalten:

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

nachdem er sich dem Raum "public-alfred" von einem einzigen Client angeschlossen hatte, enthielt io.sockets.adapter.rooms Folgendes:

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

In einer neuen Version von socket.io (1.x) verursacht io.sockets.manager.rooms einen Fehler. Sie sollten stattdessen io.sockets.adapter.rooms verwenden.

16
Salvador Dali

Wie jeder gesagt hat, sind die Räume in einer neuen Version von socket.io (1.x) unter:

    io.sockets.adapter.rooms

Dies wird etwas zurückgeben:

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

Der einzige Raum, den ich haben möchte, ist 'myRoom'. Deshalb habe ich die folgende Funktion geschrieben:

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

Das war irgendwie verwirrend für mich, hoffe das hilft!

12
gastonmancini

falls Sie verwenden 

socket.io 2.1.0  

und stieß darauf.

in 2.1.0 befinden sich alle Räume auf dem Server in der Variablen io.sockets.adapter.rooms

//Use Example//

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

Sie erhalten die folgenden Ergebnisse.

{xqfGuWYkKzT9hGgGAAAB: Raum {Steckdosen: {xqfGuWYkKzT9hGgGAAAB: true }, Länge: 1}, '0Ak9nTjme7bLsD8NAAAC': Raum {Sockets: { '0Ak9nTjme7bLsD8NAAAC': wahr}, Länge: 1}}

3
Someone Special

Wenn io.sockets.adapterundefined ist.

Ich verwende socket.io 1.7.1 (Server) .

Es scheint, dass io.of("......").sockets.adapter in dieser Version von socket.ioundefined ist. Also habe ich stattdessen io.adapter.rooms verwendet und es funktioniert.

In SocketIO Version 2.2.0

  • io.sockets.manager existiert nicht mehr

Sie können alle Steckdosen in einem bestimmten Raum erhalten, indem Sie 3. verwenden.

sockel.adapterzimmer.
io.sockets.adapter.rooms
io.sockets.adapter.sids

Wenn Sie einen Namespace verwenden, sollten Sie socket.adapter.rooms verwenden, um die Raumlisten abzurufen.

{ '/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

Ich habe nicht genug Ansehen, um meinen Kommentar zu der ursprünglichen Frage zu posten. Wenn Sie jedoch alle Räume in einem Namespace auflisten möchten, sollte sie folgendermaßen codiert sein:

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

var rooms = nsp.adapter.rooms;

Dies würde helfen, wenn ein Kunde einem Raum beitritt, indem

socket.join('my-room');

Sie sollten in der Lage sein, Ihren Raumnamen zu sehen, wenn Sie console.log(rooms); tun.

Ich möchte nur einen unbeantworteten Kommentar oben beantworten, da ich auf dieselbe Frage stieß, nachdem ich nicht übereinstimmende Raumnamen gesehen hatte.

1
conchimnon

Ich konnte sie mit socket._events über eine offene Verbindung finden.

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

Ausgabe:

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

verwenden Sie dies, um alle Räume zu erhalten. 

0
Ahmad Ali