質問 socket.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] } }
単一のクライアントから「public-alfred」ルームに参加した後io.sockets.adapter.rooms
含まれる:
{ '': [ '210837319844898486' ],
'/public-alfred': [ '210837319844898486' ] }
新しいバージョンのsocket.io(1.x)では、io.sockets.manager.rooms
はエラーを引き起こします。代わりにio.sockets.adapter.rooms
を使用してください。
みんなが言ったように、socket.io(1.x)の新しいバージョンでは、部屋は次の場所にあります。
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 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.io 2.1.
そして偶然これ。
2.1.0では、サーバーのすべての部屋は変数io.sockets.adapter.roomsにあります。
//Use Example//
sockets.on('getRooms', function() {
sockets.emit('rooms', io.sockets.adapter.rooms);
});
次の結果が得られます。
{xqfGuWYkKzT9hGgGAAAB:ルーム{ソケット:{xqfGuWYkKzT9hGgGAAAB:true}、長さ:1}、 '0Ak9nTjme7bLsD8NAAAC':ルーム{ソケット:{'0Ak9nTjme7BL長さ:}} NA}の長さ:}
SocketIOバージョン2.2.0では、
io.sockets.manager
は存在しません次の3を使用して、特定の部屋のすべてのソケットを取得できます。
socket.adapter.rooms;
io.sockets.adapter.rooms
io.sockets.adapter.sids
名前空間を使用している場合は、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
}
}
io.sockets.adapter
_がundefined
..の場合.socket.io 1.7.1(Server)を使用しています。
そのバージョンの_socket.io
_ではio.of("......").sockets.adapter
はundefined
のようです。そのため、代わりに_io.adapter.rooms
_を使用しましたが、機能します。
開いている接続でsocket._eventsを使用してそれらを見つけることができました。
io.sockets.on('connection', function(socket){
socket.on('ping', function(data){
console.log(socket._events);
});
});
出力:
{
ping: [Function],
disconnect: [Function]
}
Object.keys(io.sockets.adapter.rooms)
これを使用してすべての部屋を取得します。
元の質問にコメントを投稿するのに十分な評判がありませんが、さらに、名前空間内のすべての部屋を一覧表示する場合は、次のようにコーディングする必要があります。
_var nsp = io.of('/my-nsp');
var rooms = nsp.adapter.rooms;
_
これは、クライアントが次の方法でルームに参加する場合に役立ちます。
_socket.join('my-room');
_
console.log(rooms);
を実行すると、部屋の名前が表示されます。
部屋の名前が一致していないのを見た後、同じ問題に遭遇したので、上記の未回答のコメントに答えたいだけです。
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;}