web-dev-qa-db-ja.com

socket.ioのチャットルームに何人いるかを取得する

私は今、ニックネームとルームを設定するこのコードを持っています:

io.sockets.on('connection', function(client){
    var Room = "";
    client.on("setNickAndRoom", function(nick, fn){
        client.join(nick.room);
        Room = nick.room;
        client.broadcast.to(Room).emit('count', "Connected:" + " " + count);
        fn({msg :"Connected:" + " " + count});
    });

Room.lengthのような特定のチャットルームに接続されている人数を取得する方法を知りたいと思いました。

クライアント側 :

function Chat(){
    this.socket = null;
    this.Nickname = "";
    this.Room = "";
    var synched = $('#syncUp');
    this.Connect = function(nick, room){ 
        socket =  io.connect('http://vybeing.com:8080');    
        Nickname = nick;
        Room = room;
        //conectarse
        socket.on('connect',function (data) {
            socket.emit('setNickAndRoom', {nick: nick, room: room}, function(response){
                $("#connection").html("<p>" + response.msg + "</p>");
            });
        });
}

私はこれを見つけましたが、定義されていません:

count = io.rooms[Room].length;
36
re1man

バージョン<1を使用している場合

var clients = io.sockets.clients(nick.room); // all users from room

27

socket.ioバージョン> = 1.0の場合:

ルームは1.4で.lengthプロパティを持つ実際のタイプになったため、1.4.xメソッドは今後安定するはずです。

'my_room'に接続されているすべてのクライアントをカウントするには:

1.4以降:

var room = io.sockets.adapter.rooms['my_room'];
room.length;

1.3.x:

var room = io.sockets.adapter.rooms['my_room'];
Object.keys(room).length;

1.0.xから1.2.x:

var room = io.adapter.rooms['my_room'];
Object.keys(room).length;

これは、単一のノードで default room adapter で実行していることを前提としています( cluster とは対照的です)。物事は より複雑 クラスターにいる場合。


その他の関連例:

  • サーバーに接続されているすべてのクライアントをカウントします。

    var srvSockets = io.sockets.sockets;
    Object.keys(srvSockets).length;
    
  • 名前空間'/chat'に接続されているすべてのクライアントをカウントします:

    var nspSockets = io.of('/chat').sockets;
    Object.keys(nspSockets).length
    
86
kdbanman

Socket.io 1.4.6では、部屋に加えて名前空間を指定するのが効果的でした。デフォルトのネームスペースを使用する場合は、['/']として指定できます。たとえば、デフォルトのネームスペース(nsps)のルーム「kitchen」に接続されているクライアントの数を取得するには、次のように記述します。

var io = require('socket.io')();
io.nsps['/'].adapter.rooms['kitchen'].length

注意:ルームに誰も参加していない場合、まだ作成されていないため、io.nsps['/'].adapter.rooms['kitchen']undefinedを返します。未定義のキッチンで.lengthを呼び出そうとすると、アプリがクラッシュします。

7

バージョン1.4.5で

var clientNumber = io.sockets.adapter.rooms[room].length;
5
Márton Vető

部屋のユーザーのリストを取得したかった。これが私の解決策になりました。

ユーザー名プロパティをソケットに追加しましたが、完全を期すために、それをソケットのIDである「id」に変更しました。

var sockets = io.in("room_name")
Object.keys(sockets.sockets).forEach((item) => {
  console.log("TODO: Item:", sockets.sockets[item].id)            
})

Socket.io v2.0.3

1
The Lazy Coder

私は1.4.6を使用していますが、これはトリックをしました:

Object.keys(io.sockets.connected).length
1
Alex Klibisz

Socket.io v2.0.3の場合、redisサーバーを実行し、socket.io-redisプラグインを使用しました。その後、次のことができます。

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
  console.log(clients); // an array containing socket ids in 'room1' and/or 'room2'
});

コードは https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction からのものです

kevzettlerはsocket.io-redisを指摘してくれました


The Lazy Coderのsocket.io v2.0.3に対するもう1つの答えは、私にとってはうまくいきませんでした。部屋に関係なく、接続されているすべてのクライアントのリストが表示されました。

1
Dries Cleymans

これを関数に入れると、クラッシュを防ぐためのフェイルセーフが得られます:

var roomCount = io.nsps['/'].adapter.rooms[roomName];
if (!roomCount) return null;
return roomCount.length;
0
Video Coder