使用socket.io创build一个连接的客户端列表

这里有2个相关的问题。 把它们放在一起更有意义。

问题1

我有一个node.js应用程序,它向所有客户端发出一个事件,所有当前的客户端都会响应一个ready发出的消息。 我怎样才能创build一个列表,回答最初发出的所有客户端,以及可以使用哪种标识来区分客户端?

问题2:

收集连接客户端列表后,我正在尝试执行的操作是访问一个包含N行的MySQL数据库表,并为每个客户端分配X行。 这些行将被发回到它们各自的客户端。 如何才能做到这一点?

Qn当前代码

节点代码

 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 当前代码 该代码适用于单个客户端,但是如何循环访问所有连接的客户端并执行相同的列更新和行select?

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

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

 var clients = []; io.sockets.on('connect', function(client) { clients.push(client); client.on('disconnect', function() { clients.splice(clients.indexOf(client), 1); }); }); 

然后,您可以引用clients在服务器上的任何位置,在您的事件处理程序或任何其他地方。 就像是:

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

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

 io.sockets.clients() 

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

如果你想让所有的客户端连接到一个特定的名字空间:

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

但是,你甚至可以过滤更多..如果你想在一个房间所有的sockets:

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

room name here as first argument返回room name here as first argument的连接套接字数组