如何在socket.io nodejs服务器上列出房间

在关于如何创buildsocket.io多播组的问题上取得进展之后,我发现使得我的房间成为我所需要的很好的方式。

但是,了解所有的房间,没有额外的数据结构,这将是一件好事。

是否有可能从服务器套接字获取服务器上所有房间的列表?

简短的回答:

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

从一个客户io.sockets.adapter.roomsjoin房间“公共io.sockets.adapter.rooms包含:

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

在新版本的socket.io(1.x)中, io.sockets.manager.rooms会导致错误。 你应该使用io.sockets.adapter.rooms

正如大家所说,在一个新版本的socket.io(1.x)中,可以在以下位置find这些房间:

  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:

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

这有点让我困惑,希望这有助于!

我可以在打开的连接上使用socket._eventsfind它们。

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

输出:

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

如果io.sockets.adapterundefined

我正在使用socket.io 1.7.1(服务器)

看来io.of("......").sockets.adapter在该版本的socket.io上是undefined的。 所以我用io.adapter.rooms来代替它。