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

Nyx*_*nyx 8 node.js socket.io

这是2个相关问题.将它们放在一起更有意义.

问题1

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

问题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);
Run Code Online (Sandbox Code Playgroud)

客户端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
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

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
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

3rd*_*den 20

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

io.sockets.clients()
Run Code Online (Sandbox Code Playgroud)

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

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

io.of('/namespace').clients()
Run Code Online (Sandbox Code Playgroud)

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

io.sockets.clients('room name here as first argument')
Run Code Online (Sandbox Code Playgroud)

将为房间返回一组连接的套接字 room name here as first argument

  • 我相信这个答案中的功能在1.0中已弃用 (11认同)

ros*_*dia 16

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

var clients = [];

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

    client.on('disconnect', function() {
        clients.splice(clients.indexOf(client), 1);
    });
});
Run Code Online (Sandbox Code Playgroud)

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

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
            });
        });
    });
});
Run Code Online (Sandbox Code Playgroud)