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?
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' ] }
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.
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!
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}}
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 plusVous 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
}
}
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.
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]
}
Object.keys(io.sockets.adapter.rooms)
utilisez-le pour obtenir toutes les chambres.