【问题标题】:Socket IO: Number of users in a roomSocket IO:一个房间的用户数
【发布时间】:2015-10-12 09:52:35
【问题描述】:

使用 Socket.IO v.1.3.5 用于 node.JS...

如何获取房间中连接的真实用户(不是会话)的数量?

会话数:

 var room = io.sockets.adapter.rooms[roomId] || {};
 var numSocketsInRoom = Object.keys(room).length;

但是如果同一个用户在多个浏览器标签中连接,numSocketInRoom 会增加,因为是会话数,而不是实际用户数。

在我的情况下,任何套接字都将用户保存在socket.userId,但我不知道如何指出这一点以获取房间中连接的用户数量...

谢谢!

【问题讨论】:

  • 好吧,您确实拥有带有roomID 的房间的对象,对于用户,您也可以使用相同的方法var users = {} 并在那里添加ID。
  • 哦,这是个好主意。我要试试看。
  • 确保您还删除了断开连接的用户,更新用户列表的一项改进是添加一些心跳 ping 或基于时间的检查。
  • 我在我的解决方案中添加了一个答案。是否需要心跳 ping 或基于时间的检查?我用socket.on('disconnect',callback)
  • 只是为了使有关用户的数据无效,也为了使解决方案更加持久,您应该使用 Redis、MongoDB,如果应用程序崩溃您会丢失您的信息。如果您想将应用程序扩展到多个实例,则同样的规则适用。

标签: node.js socket.io


【解决方案1】:

我的解决方案最终是这段代码,这段代码在 join (isConnect = true) 或 leave (isConnect = false) room 之后执行>:

//Get the room:
var room = io.sockets.adapter.rooms[roomId] || {};
//Declaration of number of users variable
var numUsers;

//If there are any user connected in the room, create the object
if(room.user===undefined) 
  room.user = {};

//If you join the room and have another opened session, increase the number of sessions
if(room.user[socket.request.user.id] && isConnect)
   room.user[socket.request.user.id] += 1;

//If you leave the room and have another opened session, decrease the number of sessions
else if(room.user[socket.request.user.id] && !isConnect){
    room.user[socket.request.user.id] -= 1;

    //If the number of sessions is 0, delete the user from the object
    if(room.user[socket.request.user.id]===0)
       delete room.user[socket.request.user.id];
 }
//If the user don't have any session and join the room, put 1 session in the object
else if(isConnect){
  room.user[socket.request.user.id] = 1;
}

//Get the number of users from room.user object
numUsers = Object.keys(room.user).length;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多