在socket.io中的聊天室中有多少人

时间:2012-02-19 19:40:44

标签: 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', "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;

8 个答案:

答案 0 :(得分:82)

对于socket.io版本&gt; = 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)。如果您在群集中,事情就是more complicated


其他相关例子:

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

    var srvSockets = io.sockets.sockets;
    Object.keys(srvSockets).length;
    
  • 计算连接到命名空间'/chat'的所有客户端:

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

答案 1 :(得分:25)

如果您使用的是版本&lt; 1,

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

答案 2 :(得分:6)

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

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

抬头:如果没有人加入房间,但尚未创建,因此io.nsps['/'].adapter.rooms['kitchen']将返回undefined。如果您尝试在未定义的厨房上致电.length,您的应用就会崩溃。

答案 3 :(得分:5)

在1.4.5版本中

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

答案 4 :(得分:1)

我使用的是1.4.6,这就是诀窍:

<IfModule mod_rewrite.c>
## Go Daddy servers need the Options -MultiViews code below
Options -MultiViews
RewriteEngine On
RewriteBase /

    # To externally redirect /dir/foo.php to /dir/foo
    RewriteCond %{REQUEST_METHOD} !POST
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
    RewriteRule ^ %1 [R,L,NE]

    ## To internally redirect /dir/foo to /dir/foo.php
    RewriteCond %{REQUEST_FILENAME}.php -f [NC]
    RewriteRule ^ %{REQUEST_URI}.php [L]
</IfModule>

答案 5 :(得分:1)

我想获得一个房间的用户列表。 这最终成了我的解决方案。

我在socket中添加了一个用户名属性,但为了完整性我将其更改为“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

答案 6 :(得分:1)

对于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的另一个答案对我不起作用,它给了我一个所有连接客户的列表,无论房间如何。

答案 7 :(得分:0)

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

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