2017-02-16 2 views
3

Je développe une application en temps réel en utilisant Node.js, Socket, io, Redis. J'essaye d'envoyer un message privé à un client du travailleur, mais cela ne fonctionne pas. Array io.sockets.connected sur le worker est vide et je ne peux pas me référer au client.Comment envoyer un message privé (emit) à partir de socket.io-redis

Code de maître:

var io = require('socket.io')(30042); //socket.io(<port>) will create a http server 
var redis = require('socket.io-redis'); 
io.adapter(redis({ host: 'localhost', port: 6379 })); 
io.on('connection', function (socket) { 
    io.sockets.connected[socket.id].adapter.remoteJoin(socket.id, 'new_room', function (err) {}); 
}); 

Code de travailleur:

var SocketIO = require('socket.io'); 
var redis = require('socket.io-redis'); 
io = new SocketIO(); //start redis socket-io 
io.adapter(redis({host: 'localhost', port: 6379})); // where your redis server is located 

//send to all users in room - works perfectly 
io.to('new_room').emit('chat message', 'Test global msg from worker'); 

//???? 
//dont work - io.sockets.connected is empty 
io.sockets.connected['socket_id_from_master'].emit('chat message', 'Test private msg from worker'); 

Qu'est-ce que je fais mal?

+0

J'ai trouvé un moyen de sortir: chaque prise en Socket.IO est identifié par un identifiant aléatoire, unguessable, unique Socket id # . Pour votre commodité, chaque socket rejoint automatiquement une pièce identifiée par cet identifiant. Code du travailleur: io.to (id) .emit ('message de discussion', 'Test private msg from worker'); –

Répondre

0

Étant donné que votre opérateur ne sait rien sur les sockets connectés, vous devez les obtenir à partir de l'adaptateur, en l'occurrence Redis.

Pour les sockets connectées, vous devez appeler: io.sockets.adapter.clients