在socket.io v1中迭代套接字? " ...没有方法'客户'"

时间:2014-05-29 23:24:36

标签: javascript node.js sockets socket.io

在我写这样的东西之前:

io.sockets.clients().forEach(function (socket) { 
    socket.emit(signal,data);
});

现在,我无法得到错误Object #<Namespace> has no method 'clients'

还有其他办法吗?这是使用socket v1.0。 (或者我认为是1.0.2)。

为此,我知道我可以使用io.emit(),但我想迭代套接字并在计时器中对它们执行函数。我可以将所有内容重构为回调并在io.on()上设置计时器,但我认为我需要能够使用引用(我认为javascript会在这种情况下复制对象socket而不是引用它吗?)

这是一个例子

setInterval(function(){
    io.sockets.clients().forEach(function (socket) { 
        socket.emit('newMessage',someCalculations());
    });
},1000);

4 个答案:

答案 0 :(得分:3)

如果必须将有关所有连接套接字的信息发送到单个套接字,那么

    for (var i in io.sockets.connected) {
        var s = io.sockets.connected[i];
        if (socket.id === s.id) {
           continue;
        }
        socket.emit('notify_user_state', s.notify_user_state_data)
    }

答案 1 :(得分:1)

这是我目前的解决方案:

var socketList = new Array();
io.on('connection',function(socket){
    socketList.push(socket);
});

setInterval(function(){
    socketList.forEach(function(){
        socket.emit('newMessage',someCalculations());
    });
},1000);

答案 2 :(得分:1)

我遇到了同样的问题。尝试使用:

io.sockets.emit('newMessage', someCalculations());

希望有所帮助

答案 3 :(得分:1)

如果您想查找每个连接的客户端。你可以从engine.io

获得它们
for (var sid in io.engine.clients) {
  io.to(sid).emit('your message', data);
}

io.engine.clients是一个哈希值。键是套接字ID,值包含一些有用的信息。例如request。如果您使用passport.socketio。您可以从该位置获得authed用户。