Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a list of Connected Clients using socket.io

Here are 2 related questions. Posting them together makes more sense.

Question 1

I have a node.js app which emits an event out to all clients, and all current clients will respond with a ready emit. How can I create a list of all the clients that replied to the initial emit, and what kind of identification can be used to distinguish the clients?

Question2:

What I am trying to do after collect a list of connected clients, is to then access a MySQL database table of N number of rows and assign each client X rows each. These rows will be emitted back to their respective clients. How can this be done?

Current Code for Qn 1

Node Code

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

Client-side JS Code

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

Current Code for Qn 2 The code works for a single client, but how do I loop through all connected clients and perform the same updating of column and selecting of rows?

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
        });
    });
});
like image 367
Nyxynyx Avatar asked Nov 27 '11 06:11

Nyxynyx


People also ask

How many Socket connections can Socket.IO handle?

As we saw in the performance section of this article, a Socket.IO server can sustain 10,000 concurrent connections.

What is the difference between Socket.IO and socket IO client?

socket-io. client is the code for the client-side implementation of socket.io. That code may be used either by a browser client or by a server process that is initiating a socket.io connection to some other server (thus playing the client-side role in a socket.io connection).

Is Socket.IO same as WebSocket?

Socket.IO is a library that enables low-latency, bidirectional and event-based communication between a client and a server. It is built on top of the WebSocket protocol and provides additional guarantees like fallback to HTTP long-polling or automatic reconnection.


2 Answers

Socket.io provides you with a public api for that, so instead of hacking something up like Bryan suggest you can use:

io.sockets.clients()

That will returns an array of all connected clients.

If you want all clients connected to a certain namespace:

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

But you can even filter it even more.. if you want to have all sockets in a room:

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

Will return a array of connected sockets for the room room name here as first argument

like image 61
3rdEden Avatar answered Oct 26 '22 18:10

3rdEden


You will need to keep track of the connected clients yourself. The simple way to do that would be to use an array:

var clients = [];

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

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

Then you can references that clients array on the server wherever you need to, in your ready event handler or whatever. Something like:

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
            });
        });
    });
});
like image 42
rossipedia Avatar answered Oct 26 '22 19:10

rossipedia