使用socket.io创建连接的客户端列表

时间:2011-11-27 06:54:16

标签: node.js socket.io

以下是2个相关问题。将它们放在一起更有意义。

问题1

我有一个node.js应用程序向所有客户端发出一个事件,所有当前客户端都会响应ready个发射。如何创建回复初始发射的所有客户端的列表,以及可以使用哪种标识来区分客户端?

问题2:

我在收集连接客户端列表后尝试做的是,然后访问N行数的MySQL数据库表,并分别为每个客户端分配X行。这些行将被发回给各自的客户端。怎么办呢?

Qn 1的当前代码

节点代码

setInterval(function() {
    util.log('Checking for new jobs...');
    dbCheckQueue(function(results) {  // checks if there are new rows to "distribute" to clients
        if (results.length) {
            util.log(results.length + ' new jobs found.');
            io.sockets.emit('job_available');
        }
    });
}, 10*1000);

客户端JS代码

socket.on('job_available', function() {
                console.log('Job Available.. Responding with Ready!');
                socket.emit('ready');
            });

io.sockets.on('connection', function(socket) {
    socket.on('ready', function() {
        // UPDATE N rows with client_id in column checkout.
        // Then SELECTS * from table where checkout = client_id
        getListings(client_id, function(listings) {
            socket.emit('job', listings);   // send jobs
        });
    });
});

Qn 2的当前代码 该代码适用于单个客户端,但如何遍历所有连接的客户端并执行相同的列更新和行选择?

io.sockets.on('connection', function(socket) {
    socket.on('ready', function() {
        // UPDATE N rows with client_id in column checkout.
        // Then SELECTS * from table where checkout = client_id
        getListings(client_id, function(listings) {
            socket.emit('job', listings);   // send jobs
        });
    });
});

2 个答案:

答案 0 :(得分:20)

Socket.io为你提供了一个公共API,所以不要像布莱恩那样黑客攻击建议你可以使用:

io.sockets.clients()

这将返回所有连接客户端的数组。

如果您希望所有客户端都连接到某个命名空间:

io.of('/namespace').clients()

但你甚至可以过滤它...如果你想在一个房间里有所有的插座:

io.sockets.clients('room name here as first argument')

将为房间room name here as first argument

返回一组连接的套接字

答案 1 :(得分:16)

您需要自己跟踪已连接的客户端。这样做的简单方法是使用数组:

var clients = [];

io.sockets.on('connect', function(client) {
    clients.push(client); 

    client.on('disconnect', function() {
        clients.splice(clients.indexOf(client), 1);
    });
});

然后,您可以在clients事件处理程序或其他任何内容中的任何位置引用服务器上的ready数组。类似的东西:

io.sockets.on('connection', function(socket) {
    socket.on('ready', function() {
        // UPDATE N rows with client_id in column checkout.
        // Then SELECTS * from table where checkout = client_id
        clients.forEach(function(client, index) {
            var client_id = index; // Just use the index in the clients array for now
            getListings(client_id, function(listings) {
                socket.emit('job', listings);   // send jobs
            });
        });
    });
});