如何在socket.io nodejs服务器上列出房间
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6631501/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to list rooms on socket.io nodejs server
提问by pyramation
after progress on the question how to create socket.io multicast groups, I found making rooms a great way to do what I needed.
在如何创建 socket.io 多播组的问题上取得进展后,我发现制作房间是做我需要的事情的好方法。
However, it would be great to know about all the rooms, without an extra data-structure.
但是,如果没有额外的数据结构,了解所有房间会很棒。
Is it possible to get a list of all rooms on the server from the server socket?
是否可以从服务器套接字获取服务器上所有房间的列表?
回答by Alfred
The short answer:
简短的回答:
io.sockets.adapter.rooms
I analysed io:
我分析io:
I got the following output:
我得到以下输出:
{ 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] } }
after joining room "public-alfred" from a single client io.sockets.adapter.roomscontained:
从单个客户加入房间“public-alfred”后io.sockets.adapter.rooms包含:
{ '': [ '210837319844898486' ],
'/public-alfred': [ '210837319844898486' ] }
回答by Salvador Dali
In a new version of socket.io (1.x), io.sockets.manager.roomswill cause an error. You should use io.sockets.adapter.roomsinstead.
在新版本的 socket.io (1.x) 中,io.sockets.manager.rooms会导致错误。你应该io.sockets.adapter.rooms改用。
回答by gastonmancini
As everyone said, in a new version of socket.io (1.x) the rooms can be found at:
正如大家所说,在新版本的 socket.io (1.x) 中,可以在以下位置找到房间:
io.sockets.adapter.rooms
This will return something like:
这将返回如下内容:
{
'qNADgg3CCxESDLm5AAAA': [ 'qNADgg3CCxESDLm5AAAA': true ],
'myRoom': [ 'qNADgg3CCxESDLm5AAAA': true,
'0rCX3v4pufWvQ6uwAAAB': true,
'iH0wJHGh-qKPRd2RAAAC': true ],
'0rCX3v4pufWvQ6uwAAAB': [ '0rCX3v4pufWvQ6uwAAAB': true ],
'iH0wJHGh-qKPRd2RAAAC': [ 'iH0wJHGh-qKPRd2RAAAC': true ]
}
The only room that I want to get is 'myRoom', so I wrote the following function for doing that:
我想要获得的唯一房间是“myRoom”,因此我为此编写了以下函数:
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;
}
This was kind of confusing for me, hope this helps!
这对我来说有点混乱,希望这会有所帮助!
回答by Md Alamin
In socketIO version 2.2.0,
在 socketIO 2.2.0 版本中,
io.sockets.managerdoes not exist anymore
io.sockets.manager不再存在
You can get all sockets in a specific room using followings 3.
socket.adapter.rooms;
io.sockets.adapter.rooms
io.sockets.adapter.sids
您可以使用以下3获得特定房间中的所有插座。
socket.adapter.rooms;
io.sockets.adapter.rooms
io.sockets.adapter.sids
If you are using namespace you should use socket.adapter.roomsto get the room lists.
如果您使用命名空间,您应该使用它socket.adapter.rooms来获取房间列表。
{ '/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
}
}
回答by Someone Special
in case you are using
如果您正在使用
socket.io 2.1.0
socket.io 2.1.0
and chanced upon this.
并偶然发现了这一点。
in 2.1.0, all the rooms in the server are located in the variable io.sockets.adapter.rooms
在 2.1.0 中,服务器中的所有房间都位于变量io.sockets.adapter.rooms 中
//Use Example//
sockets.on('getRooms', function() {
sockets.emit('rooms', io.sockets.adapter.rooms);
});
You will get the following results.
您将得到以下结果。
{ xqfGuWYkKzT9hGgGAAAB: Room { sockets: { xqfGuWYkKzT9hGgGAAAB: true }, length: 1 }, '0Ak9nTjme7bLsD8NAAAC': Room { sockets: { '0Ak9nTjme7bLsD8NAAAC': true }, length: 1 } }
{ xqfGuWYkKzT9hGgGAAAB:房间{插座:{xqfGuWYkKzT9hGgGAAAB:真},长度:1},'0Ak9nTjme7bLsD8NAAAC':房间{插座:{'0Ak9nTjme7bLsD1},NAAAC:'
回答by Константин Ван
If io.sockets.adapteris undefined..
如果io.sockets.adapter是undefined..
I'm using socket.io 1.7.1 (Server).
我正在使用socket.io 1.7.1 (Server)。
It seems io.of("......").sockets.adapteris undefinedon that version of socket.io. So I used io.adapter.roomsinstead and it works.
好像io.of("......").sockets.adapter是undefined那个版本的socket.io。所以我io.adapter.rooms改用它并且它有效。
回答by Ahmad Ali
Object.keys(io.sockets.adapter.rooms)
use this to get all rooms.
使用它来获取所有房间。
回答by Ahmad Ali
I was able to find them using socket._events on an open connection.
我能够在打开的连接上使用 socket._events 找到它们。
io.sockets.on('connection', function(socket){
socket.on('ping', function(data){
console.log(socket._events);
});
});
Output:
输出:
{
ping: [Function],
disconnect: [Function]
}
回答by conchimnon
I don't have enough reputation to post my comment to the original question, but in addition, if you want to list all the rooms in a namespace, it should be coded like this:
我没有足够的声誉来发表我对原始问题的评论,但此外,如果您想列出命名空间中的所有房间,则应将其编码如下:
var nsp = io.of('/my-nsp');
var rooms = nsp.adapter.rooms;
This would help so that if a client join a room by:
这将有助于如果客户通过以下方式加入房间:
socket.join('my-room');
You should be able to see your room name when you do console.log(rooms);
当你这样做时,你应该能够看到你的房间名称 console.log(rooms);
I just want to answer an unanswered comment above as I ran into the same issue after I saw mismatched room names.
我只想回答上面一个未答复的评论,因为我在看到不匹配的房间名称后遇到了同样的问题。
回答by Jay Stratemeyer
function ActiveRooms(){
var activeRooms = [];
Object.keys(io.sockets.adapter.rooms).forEach(room=>{
var isRoom = true;
Object.keys(io.sockets.adapter.sids).forEach(id=>{
isRoom = (id === room)? false: isRoom;
});
if(isRoom)activeRooms.push(room);
});
return activeRooms;}

