2013-08-07 59 views
11

我试图显示特定房间中的客户列表。我只想显示他们的用户名,而不是他们的套接字ID。套接字IO房间:获取特定房间中的客户列表

这我在哪里:

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或任何东西。希望它能够返回昵称。

回答

12

只是几件事。

  1. 当你有socket然后你可以设置属性,如:socket.nickname = 'Earl';以后使用例如保存财产控制台日志: console.log(socket.nickname);

  2. 你在哪里缺少一个右引号(')在您:

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

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

下面是修改后的代码应该帮助你了一下,也知道我用下面的循环是异步的,这可能会影响您如何处理数据传输。

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

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

+0

非常感谢,这个作品很棒! – Taurian

+1

“io.sockets.clients('chatroom1')”是否在nodejs v1.0及更高版本中工作? –

-1

您可以创建用户采集的数组对象

var users = {}; 

然后在服务器端,您可以在连接

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

而显示用户将其添加为新的用户,你可以循环“用户”对象

客户端上

var socket = io.connect(); 

socket.on('connect', function() { 
    socket.emit('new-user', 'username'); 
}); 
+0

认真,你会从客户端发送用户名,而不是检查cookie和东西?这不是很容易做到吗? –

+0

我建议使用socket.handshake.query与中间件进行身份验证,然后将该标记/用户名作为套接字属性存储,以便从服务器端引用,以便它可以正常工作。 –

24

对于使用socket.IO版本1.0或更高版本的用户,上述答案可能不起作用。请参考以下回答。 Get list of all clients in specific room

代码在一个房间以上

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

} 
+0

为什么downvote?它在1.0和更高版本中不起作用 – memical

+1

我需要> 1.0的东西,但是您明确指出这不适用于1.0以上版本,没有理由为downvote。有一个+1来平衡它:页。 – StackOverflowed

1

所有的答案,这里的一个socket.io get rooms which socket is currently in或这里Socket.IO - how do I get a list of connected sockets/clients?是不正确或不完整的,如果你使用2.0更新所有客户端Socket对象。

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

    socket.adapter。房间;

    io.sockets.adapter.rooms;

    io.sockets.adapter.sids; //将socket.id阵列

  3. 随着命名空间(I使用 “CS” 在这里),io.sockets.adapter.rooms会给出一个相当混乱的结果和所述结果socket.adapter.rooms给出正确的是:

    /* socket.adapter.rooms给:*/

    { “/ CS#v561bgPlss6ELZIZAAAB”:{ “套接字”:{ “/ CS#v561bgPlss6ELZIZAAAB”: “}房间xxx”:{“sockets”:{“/ cs#v561bgPlss6ELZIZAAAB”:true},“length”:1}}

    /* io.sockets.adapter.rooms给:一个SID而不命名空间*/

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

注意:默认房间是这样的:“Each Socket in Socket.IO is identified by a random, unguessable, unique identifier Socket#id. For your convenience, each socket automatically joins a room identified by this id”。

我只尝试过内存适配器到目前为止,还没有试过redis-adapter。

相关问题