Reputation: 43
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
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);
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