web-dev-qa-db-ja.com

socket.ioソケットが現在ある部屋を取得する

呼び出すことなく、ソケットが現在ある部屋を取得することは可能ですか?

io.sockets.clients(roomName)

すべての部屋名と結果でこのソケットを探します

19
Herokiller

Socket.IO Room doc から:

io.sockets.manager.roomClients[socket.id]

9
Laurent Perrin

Socket.ioバージョン1+では、構文は次のとおりです。

socket.rooms
29
Arjen

socket.io 1.7.3 +->

Object.keys( io.sockets.adapter.sids[socket.id] )
// returns [socket.id, room-x'] || [socket.id, 'room-1', 'room-2', ...]

バージョン1.7.3、socket.roomsにはsocket.idが含まれているため、これを削除して部屋のリストを取得します。

Object.keys(socket.rooms).filter(item => item!=socket.id);

他のバージョンでは、socketを印刷して部屋を見つけることができます。

2
Zing Lee

Socket.io-redisなどの非デフォルトアダプターを使用する場合、socket.roomsはうまく機能しないようです。ループせずに特定のクライアントの部屋を取得する方法は、部屋をオブジェクトとして返すio.sockets.adapter.sids[socket.id]を使用することでした。

{ 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true }

ただし、これは他のプロセスのソケットをリストしないことに注意してください!

socket.io v1.3.7、socket.io-redis 1.0.0

2
natancodes

ソケットが一度に1つの部屋だけにあることを確認して、私の解決策は次のとおりでした:

var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);
1
Adry

バージョン2.0.3

io.sockets.sockets[yourSocketID].rooms

それと等しい

socket.rooms
1
StefansArya

Socket.io v2.1.1

ですから、私がそうであったように、disconnectイベントのソケットルームにアクセスしていないことを確認してください。ソケットルームは、イベントがトリガーされる時点ですでにルームを離れているためです。やりたい場合は、disconnectingイベントで試してください- https://github.com/socketio/socket.io/pull/2332/files

その後、次のいずれかを使用できます。

Object.keys(socket.adapter.rooms)
Object.keys(socket.adapter.sids)
Object.keys(socket.rooms)
1
FergusThePlant

部屋に参加するときに、ソケット自体に部屋を保存できます

// join room
socket.join(room);

// update socket's rooms
if (socket.rooms) {
    socket.rooms.Push(room);
} else {
    socket.rooms = [room];
}

後で、ソケットが入っているすべての部屋を簡単に取得できます

socket.rooms

サーバーAPIドキュメントから:

socket.rooms(オブジェクト)
このクライアントがいる部屋を識別する文字列のハッシュであり、部屋名でインデックスが付けられています。

https://socket.io/docs/server-api/#socket-rooms

0
pradeep

socket.io 1.7.3 +

var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room
0
filemono