得到有多less人在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}); }); 

我想知道如何让多less人连接到特定的聊天室…比如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属性的实际types,所以从现在开始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; 

这是假设你在单个节点(而不是集群 )上运行默认的房间适配器 。 如果你在一个集群中,情况会更复杂 。


其他相关示例:

  • 统计连接到服务器的所有客户端

     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)中连接到房间“厨房”的客户端的数量,您可以编写:

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

io.nsps['/'].adapter.rooms['kitchen'] :如果没有人join房间,它还没有被创build,因此io.nsps['/'].adapter.rooms['kitchen']将返回undefined 。 如果您尝试在未定义的厨房中调用.length ,则您的应用程序将崩溃。

在1.4.5版本中

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

我正在使用1.4.6,这个技巧:

 Object.keys(io.sockets.connected).length 

我想得到一个房间里的用户列表。 这最终成为我的解决scheme。

我添加了一个用户名属性到我的套接字,但为了完整性,我把它改为“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

对于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的其他答案对我来说不起作用,它给了我一个所有连接客户端的列表,不pipe房间是什么。

把它放在一个函数中,它会给你失败保险以防止崩溃:

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