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
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;