obidano
obidano

Reputation: 43

send message to one user using Socket.io

I'm looking for a way to send messages to one specific client with Node.js, socket.io, Redis. ( which also means to keep track of that user)

your help, please

var app = require('express')();

var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var user=[];

server.listen(3000);
io.on('connection', function (socket) {

    var redisClient = redis.createClient();
    redisClient.subscribe('message');

    user[socket.handshake.query.userid] = socket;

    socket.on('create', function(id) {
        user[id] = socket;
    });

  
    redisClient.on("message", function(channel, message) {
        var message=JSON.parse(message);
        var id=JSON.parse(message.id);
        var target=id;
             
        console.log("target id => "+user[target].id+" / socket.id => "+socket.id)
        
         try{
             if(user[target].id==socket.id){
                  user[target].emit(channel,message.msg);
              }else{
                  console.log('when socket.id dont match')
               }
         }catch (e){
             console.log(e);
         }
      console.log("\n#########################\n");
         
    });

  

});

Upvotes: 1

Views: 1905

Answers (1)

amenzou
amenzou

Reputation: 319

Indeed you need to store the incoming connection.
Client:

var userid = '69b6';//anything you like
var con = io.connect('localhost:4545/', { query: `userid=${userid}` });

Server:

var users = {} ;
io.on('connection', function(client){
  users[client.handshake.query.userid] = client;
});

//you want to send something to a user
users[userid].emit('yolo', data);

EDIT: I reworked your code a bit

var server = require('http').Server(app);
var io     = require('socket.io')(server);
var redis  = require('redis');
var users  = {};

server.listen(3000);

var redisClient = redis.createClient();

io.on('connection', function (socket) {
  var userId     = socket.handshake.query.userid;
  users[userId]  = socket;
});

redisClient.subscribe('message');
redisClient.on("message", function(channel, message) {
  var message     = JSON.parse(message);
  var userId      = message.id;
  var userSocket  = users[userId] || null;

  console.log('=======[Message received]=======');
  console.log('UserId:', userId);
  console.log('SocketId:', userSocket.id);

  if(userSocket){
    userSocket.emit(channel, message.msg);
    console.log("Message was succefully sent!");
  }else{
    console.log('User socket unavailable');
  }
});

Tell me if it works and if you have difficulties understanding what I changed.

Upvotes: 3

Related Questions