私は今、ニックネームとルームを設定するこのコードを持っています:
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;
バージョン<1を使用している場合
var clients = io.sockets.clients(nick.room); // all users from room
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
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
を呼び出そうとすると、アプリがクラッシュします。
バージョン1.4.5で
var clientNumber = io.sockets.adapter.rooms[room].length;
部屋のユーザーのリストを取得したかった。これが私の解決策になりました。
ユーザー名プロパティをソケットに追加しましたが、完全を期すために、それをソケットの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.4.6を使用していますが、これはトリックをしました:
Object.keys(io.sockets.connected).length
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つの答えは、私にとってはうまくいきませんでした。部屋に関係なく、接続されているすべてのクライアントのリストが表示されました。
これを関数に入れると、クラッシュを防ぐためのフェイルセーフが得られます:
var roomCount = io.nsps['/'].adapter.rooms[roomName];
if (!roomCount) return null;
return roomCount.length;