套接字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或任何东西。 希望它能返回昵称。
只是几件事情。
-
当你有
socket
你可以设置如下属性:socket.nickname = 'Earl';
稍后在控制台日志中使用save属性:console.log(socket.nickname);
-
你在哪里错过了一个结束报价('):
console.log('User joined chat room 1);
-
我不完全确定你的循环。
下面是修改后的代码应该会帮助你一点,也要注意我下面使用的循环是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,则不正确或不完整。
- 在2.0中,io.sockets.manager或io.sockets.clients不再存在。
-
如果不使用名称空间,则以下3个参数都可以在特定的房间中获取套接字。
socket.adapter.rooms;
io.sockets.adapter.rooms;
io.sockets.adapter.sids; // socket.id数组
-
使用命名空间(我在这里使用了“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'); });