Javascript 获取socket.io中聊天室中的人数

Javascript 获取socket.io中聊天室中的人数,javascript,node.js,socket.io,Javascript,Node.js,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', "Connecte

我现在有一个设定缺口和空间的代码:

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>");
            });
        });
}

如果您使用的是版本<1

var clients=io.sockets.clients(nick.room);//socket.io版本>=1.0时,房间中的所有用户:

请注意,在1.4中,rooms变成了具有
.length
属性的实际类型,因此从现在起,1.4.x方法应该是稳定的。当然,除非对该类型的API进行破坏性更改

要计算连接到“我的房间”的所有客户端的数量,请执行以下操作:

1.4+:

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
    
在1.4.5版中

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

我使用的是1.4.6,这就成功了:

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

对于socket.io 1.4.6,对我来说,除了房间之外,还需要指定名称空间。使用默认名称空间时,只需将其指定为
['/']
。例如,要获取默认命名空间(nsps)中连接到房间“厨房”的客户端数量,您可以编写:

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

提醒:如果没有人加入文件室,则该文件室尚未创建,因此
io.nsps['/'].adapter.rooms['kitchen']
将返回
未定义的
。如果您试图在未定义的厨房上调用
.length
,您的应用程序将崩溃。

我想获取房间中的用户列表。 这就是我的解决方案

我在套接字中添加了一个username属性,但为了完整性,我将其更改为“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'
});
代码来自

kevzettler指给我看socket.io-redis



Lazy Coder提供的socket.io v2.0.3的另一个答案对我不起作用,它给了我一个所有已连接客户端的列表,而不考虑房间。

将其放入函数中,它将为您提供故障保护以防止崩溃:

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

更多的信息会更好,是连接到一个普通的IRC服务器还是一个自定义的聊天服务器程序?+1。这看起来应该比现在容易。只是提醒一下,这将返回房间中的一组插座。所以要想知道房间里的人数,一定要在上面的代码中加上.length,这正是我想要的。谢谢
io.sockets
返回默认的
命名空间
“/”
)。从socket.io 1.0.x开始,
名称空间
没有
.clients()
方法。我刚刚测试了它,
io.sockets.clients===undefined
。这个答案再也行不通了,这不是真的。是会话数,而不是用户数。。。如果同一用户有3个浏览器选项卡,则您案例中的客户端数量将增加3个以上的用户。如何获取房间中连接的实际用户数?:)@AralRoca无论出于何种目的,会话数都是房间中的实际用户数。您无法区分同一IP上的多个会话之间的差异,因为您所知道的可能是3个选项卡,或者一个工作网络上的三台不同计算机。此方法只计算单个节点。这将计算所有房间中所有连接的客户端。同意-应为
Object.key(io.sockets.in(room.connected).length
以获得特定房间。这应该是批准的答案。。。真实的answer@Sachin请发布一个单独的问题,代码复制您的问题。我在这里获得所有连接的插座,无论房间如何。
io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
  console.log(clients); // an array containing socket ids in 'room1' and/or 'room2'
});
var roomCount = io.nsps['/'].adapter.rooms[roomName];
if (!roomCount) return null;
return roomCount.length;