以下是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
});
});
});
答案 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
});
});
});
});