这是两个相关的问题。将它们一起发布更有意义。
问题1
我有一个node.js应用程序,它向所有客户端发出事件,所有当前客户端都将ready发出一个响应。如何创建所有回复到初始发射的客户端的列表,以及可以使用哪种标识来区分客户端?
ready
问题2:
在收集已连接的客户端列表之后,我想做的就是访问一个N具有行数的MySQL数据库表,并为每个客户端X行分配一个表。这些行将被发回给它们各自的客户端。如何才能做到这一点?
N
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 }); }); });
您将需要自己跟踪连接的客户端。做到这一点的简单方法是使用数组:
var clients = []; io.sockets.on('connect', function(client) { clients.push(client); client.on('disconnect', function() { clients.splice(clients.indexOf(client), 1); }); });
然后,您可以clients在任何需要的位置,ready事件处理程序等中引用服务器上的该数组。就像是:
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 }); }); }); });