套接字IO房间:获取特定房间中的客户列表

我试图在特定的房间里显示一个客户列表。 我只想显示他们的用户名,而不是他们的套接字ID。

我在哪里:

socket.set('nickname', "Earl"); socket.join('chatroom1'); console.log('User joined chat room 1); var roster = io.sockets.clients('chatroom1'); for ( i in roster ) { console.log('Username: ' + roster[i]); } 

没有任何运气让它列出套接字ID或任何东西。 希望它能返回昵称。

只是几件事情。

  1. 当你有socket你可以设置如下属性: socket.nickname = 'Earl'; 稍后在控制台日志中使用save属性: console.log(socket.nickname);

  2. 你在哪里错过了一个结束报价('):

    console.log('User joined chat room 1);

  3. 我不完全确定你的循环。

下面是修改后的代码应该会帮助你一点,也要注意我下面使用的循环是asynchronous的,这可能会影响你如何处理数据传输。

 socket.nickname = 'Earl'; socket.join('chatroom1'); console.log('User joined chat room 1'); var roster = io.sockets.clients('chatroom1'); roster.forEach(function(client) { console.log('Username: ' + client.nickname); }); 

为了帮助你更多我需要看到你所有的代码,因为这不给我的上下文。

对于使用socket.IO版本1.0或更高版本的人来说,上述答案可能不起作用。 请参考以下答案。 获取特定房间中所有客户的列表

代码来更新房间中所有客户端的套接字对象

 var clients = io.sockets.adapter.rooms['Room Name'].sockets; //to get the number of clients var numClients = (typeof clients !== 'undefined') ? Object.keys(clients).length : 0; for (var clientId in clients ) { //this is the socket of each client in the room. var clientSocket = io.sockets.connected[clientId]; //you can do whatever you need with this clientSocket.emit('new event', "Updates"); } 

所有上面的答案和这里的一个socket.io得到哪些套接字当前在或这里的Socket.IO – 如何获得连接的套接字/客户端列表? 如果您使用2.0,则不正确或不完整。

  1. 在2.0中,io.sockets.manager或io.sockets.clients不再存在。
  2. 如果不使用名称空间,则以下3个参数都可以在特定的房间中获取套接字。

    socket.adapter.rooms;

    io.sockets.adapter.rooms;

    io.sockets.adapter.sids; // socket.id数组

  3. 使用命名空间(我在这里使用了“cs”),io.sockets.adapter.rooms会给出一个相当混乱的结果,而socket.adapter.rooms的结果是正确的:

    / * socket.adapter.rooms给:* /

    {“/ cs#v561bgPlss6ELZIZAAAB”:{“sockets”:{“/ cs#v561bgPlss6ELZIZAAAB”:true},“length”:1},“a room xxx”:{“sockets”:{“/ cs#v561bgPlss6ELZIZAAAB”真}, “长度”:1}}

    / * io.sockets.adapter.rooms给出:没有命名空间的sid * /

    { “v561bgPlss6ELZIZAAAB”:{ “套接字”:{ “v561bgPlss6ELZIZAAAB”:真}, “长度”:1}}

注意:默认的空间是这样的:“ Socket.IO中的每个Socket都由一个随机的,不可猜测的唯一标识符Socket#id来标识。为了方便,每个套接字自动join由这个id标识的一个房间 。

我只尝试过内存适配器,没有尝试Redis的适配器。

你可以创build一个用户集合的数组对象

 var users = {}; 

那么在服务器端,您可以在连接时将其添加为新用户

 socket.on('new-user', function (username) { users[username] = username; }); 

在显示用户的同时,可以循环“用户”对象

在客户端

 var socket = io.connect(); socket.on('connect', function () { socket.emit('new-user', 'username'); });