Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

How to get socket client for a user?

How to get socket client for a user?

Problem

I'm implementing a node.js server that manages bi-connections between users with socket.io (version:0.8.7). I use an array that stores the users that have no chat partners yet. When a user requests a new partner, the app picks a user in this array and then checks to see if the user is still connected. And here's my problem:

I can't manage to get the socket client for the user, even if the user is still connected. Here's a snippet of my code:

// An array of users that do not have a chat partner
var soloUsers = [];

var io = sio.listen(app);

io.sockets.on('connection', function (socket) {


    socket.on('sessionStart', function (message) 
    {       
        // Parse the incoming event
        switch (message.event) {

            // User requested initialization data
            case 'initial':
                ...

        // User requested next partner
        case 'next':

        // Create a "user" data object for me
        var me = {
            sessionId: message.data.sessionId,
            clientId: socket.sessionid
        };

        var partner;
        var partnerClient;

        // Look for a user to partner with in the list of solo users
        for (var i = 0; i 

I get the following error:

partnerClient = io.sockets.clientsIndex[clientId];
                                       ^
TypeError: Cannot read property 'undefined' of undefined

I did an output (console.log) of the clientId, and it is definitely indefined. Furthermore, I think the API might have changed in socket.io version 0.8, and you can't use the "clientsIndex" method anymore. Does anyone know the replacement?

Thanks!!!

Problem courtesy of: Michael Eilers Smith

Solution

The best thing to do is to keep track of the connected clients in an object. Here's how I would achieve this:

var clients = {};

io.sockets.on('connection', function (socket) {
  // remember the client by associating the socket.id with the socket
  clients[socket.id] = socket; 
  socket.on('sessionStart', function (message) {
    // get the socket.id of the partner on each message
    var partner = message.from; 
    if (clients[partner]) {
      // check if the partner exists and send a message to the user
      clients[socket.id].emit('message', { from: partner, msg: message });
    }
  }

  socket.on('disconnect', function() {
    delete clients[socket.id]; // delete the client from the list
  });
}

Note: In a real production application you would normally check for the session data and associate each client with a username and a socket.id.

Solution courtesy of: alessioalex

Discussion

View additional discussion.



This post first appeared on Node.js Recipes, please read the originial post: here

Share the post

How to get socket client for a user?

×

Subscribe to Node.js Recipes

Get updates delivered right to your inbox!

Thank you for your subscription

×