getting how many people are in a chat room in socket.io [duplicate]
I have this code right now that sets the nick and room:
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});
});
I wanted to know how I could get how many people are connected to a specific chatroom...like Room.length
client side :
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>");
});
});
}
I found this, but it gives undefined:
count = io.rooms[Room].length;
For socket.io versions >= 1.0:
Note that rooms became actual types with a .length
property in 1.4, so the 1.4.x method should be stable from now on. Barring breaking changes to that type's API, of course.
To count all clients connected to '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 to 1.2.x:
var room = io.adapter.rooms['my_room'];
Object.keys(room).length;
This is assuming you're running with the default room adapter on a single node (as opposed to a cluster). Things are more complicated if you're in a cluster.
Other related examples:
-
Count all clients connected to server:
var srvSockets = io.sockets.sockets; Object.keys(srvSockets).length;
-
Count all clients connected to namespace
'/chat'
:var nspSockets = io.of('/chat').sockets; Object.keys(nspSockets).length
If you're using version < 1,
var clients = io.sockets.clients(nick.room); // all users from room
For socket.io 1.4.6, what worked for me is specifying the namespace in addition to the room. When using the default namespace, you can just specify it as ['/']
. For example, to get the number of clients connected to the room 'kitchen' in the default namespace (nsps), you would write:
var io = require('socket.io')();
io.nsps['/'].adapter.rooms['kitchen'].length
Heads up: If no one has joined a room, it hasn't been created yet, therefore io.nsps['/'].adapter.rooms['kitchen']
will return undefined
. If you try to call .length
on the undefined kitchen your app will crash.
In version 1.4.5
var clientNumber = io.sockets.adapter.rooms[room].length;