我试图让连接的客户端列表到socket.io服务器,我曾尝试以下操作: 使用socket.io客户端获取在线用户列表并保存到变量? socket.io
io.socket.clients()
这给:
TypeError: Cannot read property 'clients' of undefined
我该如何解决这个问题?
我试图让连接的客户端列表到socket.io服务器,我曾尝试以下操作: 使用socket.io客户端获取在线用户列表并保存到变量? socket.io
io.socket.clients()
这给:
TypeError: Cannot read property 'clients' of undefined
我该如何解决这个问题?
外表此代码:
var io = require('socket.io')(2558);
变种短ID =要求( '短ID');
var clients = [];
io.on( '连接',函数(插座){
var currentUser;
socket.on('USER_CONNECT', function(){
console.log('Users Connected ');
for (var i = 0; i < clients.length; i++) {
socket.emit('USER_CONNECTED',{
name:clients[i].name,
id:clients[i].id,
position:clients[i].position
});
console.log('User name '+clients[i].name+' is connected..');
};
});
socket.on('PLAY', function (data){
currentUser = {
name:data.name,
id:shortId.generate(),
position:data.position
}
clients.push(currentUser);
socket.emit('PLAY',currentUser);
socket.broadcast.emit('USER_CONNECTED',currentUser);
});
socket.on('disconnect', function(){
socket.broadcast.emit('USER_DISCONNECTED',currentUser);
for (var i = 0; i < clients.length; i++) {
if (clients[i].name === currentUser.name && clients[i].id === currentUser.id) {
console.log("User "+clients[i].name+" id: "+clients[i].id+" has disconnected");
clients.splice(i,1);
};
};
});
socket.on('MOVE', function (data){
// currentUser.name = data.name;
// currentUser.id = data.id;
currentUser.position = data.position;
socket.broadcast.emit('MOVE', currentUser);
console.log(currentUser.name+" Move to "+currentUser.position);
});
});
的console.log( “-------服务器正在运行-------”);
在最新socket.io,io.socket.clients()
需要传递给它一个回调,它将异步调用该回调:
io.socket.clients(function(err, connectedIds) {
if (!err) {
// connectedIds is an array of connected socket ids
}
});
我不知道为什么这个信息是只能通过.clients()
作为异步回调,因为如果您查看此函数的代码,那么在检索数据时不会涉及异步操作。也许有一些预期的异步操作,或者它可能与某些事情有关,例如与群集一起使用的redis适配器。
此相同的信息可同步地在一个对象形式:
var clients = io.sockets.connected;
这将是一个对象,其中所述键是用于每个连接的插座的socket.id和值是插座对象。
所以,你可以同步获取连接插座的ID在同一阵列像这样:
var connectedIds = Object.keys(io.sockets.connected);
或者,你可以把它转换成连接插座对象的数组是这样的:
var connectedSocketArray = Object.keys(io.sockets.connected).map(function(id) {
return io.sockets.connected[id];
});