node.js - rooms - cómo listar habitaciones en el servidor socket.io nodejs
socket.io express (7)
Si io.sockets.adapter
undefined
está undefined
..
Estoy usando socket.io 1.7.1 (Servidor) .
Parece que io.of("......").sockets.adapter
undefined
está undefined
en esa versión de socket.io
. Así que usé io.adapter.rooms
en io.adapter.rooms
lugar y funciona.
Después de avanzar en la pregunta sobre cómo crear grupos de multidifusión socket.io , encontré que hacer que las habitaciones sean una excelente manera de hacer lo que necesitaba.
Sin embargo, sería bueno saber sobre todas las habitaciones, sin una estructura de datos adicional.
¿Es posible obtener una lista de todas las habitaciones en el servidor desde el socket del servidor?
Como todos dijeron, en una nueva versión de socket.io (1.x) las habitaciones se pueden encontrar en:
io.sockets.adapter.rooms
Esto devolverá algo como:
{
''qNADgg3CCxESDLm5AAAA'': [ ''qNADgg3CCxESDLm5AAAA'': true ],
''myRoom'': [ ''qNADgg3CCxESDLm5AAAA'': true,
''0rCX3v4pufWvQ6uwAAAB'': true,
''iH0wJHGh-qKPRd2RAAAC'': true ],
''0rCX3v4pufWvQ6uwAAAB'': [ ''0rCX3v4pufWvQ6uwAAAB'': true ],
''iH0wJHGh-qKPRd2RAAAC'': [ ''iH0wJHGh-qKPRd2RAAAC'': true ]
}
La única habitación que quiero obtener es ''myRoom'', así que escribí la siguiente función para hacer eso:
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;
}
Esto fue un poco confuso para mí, espero que esto ayude!
En una nueva versión de socket.io (1.x), io.sockets.manager.rooms
causará un error. Deberías usar io.sockets.adapter.rooms
en io.sockets.adapter.rooms
lugar.
La respuesta corta:
io.sockets.adapter.rooms
Yo analicé io
:
Obtuve el siguiente resultado:
{ 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] } }
después de unirse a la sala "public-alfred" de un solo cliente, io.sockets.adapter.rooms
contenía:
{ '''': [ ''210837319844898486'' ],
''/public-alfred'': [ ''210837319844898486'' ] }
No tengo suficiente reputación para publicar mi comentario en la pregunta original, pero además, si desea enumerar todas las habitaciones en un espacio de nombres, debe codificarse así:
var nsp = io.of(''/my-nsp'');
var rooms = nsp.adapter.rooms;
Esto ayudaría a que si un cliente se uniera a una habitación:
socket.join(''my-room'');
Debería poder ver el nombre de su sala cuando se console.log(rooms);
Solo quiero responder a un comentario sin respuesta anterior, ya que encontré el mismo problema después de ver nombres de habitaciones que no coinciden.
Pude encontrarlos usando socket._events en una conexión abierta.
io.sockets.on(''connection'', function(socket){
socket.on(''ping'', function(data){
console.log(socket._events);
});
});
Salida:
{
ping: [Function],
disconnect: [Function]
}
en caso de que estés usando
socket.io 2.1.0
y por casualidad en esto.
en 2.1.0, todas las habitaciones del servidor se encuentran en la variable io.sockets.adapter.rooms
//Use Example//
sockets.on(''getRooms'', function() {
sockets.emit(''rooms'', io.sockets.adapter.rooms);
});
Obtendrá los siguientes resultados.
{xqfGuWYkKzT9hGgGAAAB: Room {sockets: {xqfGuWYkKzT9hGgGAAAB: true}, length: 1}, ''0Ak9nTjme7bLsD8NAAAC''