Saltar al contenido

Enviar mensaje a un cliente específico con socket.io y node.js

Te damos el resultado a esta inconveniente, o por lo menos eso creemos. Si presentas preguntas compártelo en un comentario, que para nosotros será un gusto ayudarte

Solución:

La respuesta de Ivo Wetzel ya no parece ser válida en Socket.io 0.9.

En resumen, ahora debe guardar el socket.id y use io.sockets.socket(savedSocketId).emit(...) para enviarle mensajes.

Así es como conseguí que esto funcionara en el servidor Node.js agrupado:

Primero debe configurar la tienda Redis como la tienda para que los mensajes puedan cruzar procesos:

var express = require("express");
var redis = require("redis");
var sio = require("socket.io");

var client = redis.createClient()
var app = express.createServer();
var io = sio.listen(app);

io.set("store", new sio.RedisStore);


// In this example we have one master client socket 
// that receives messages from others.

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

  // Promote this socket as master
  socket.on("I'm the master", function() 

    // Save the socket id to Redis so that all processes can access it.
    client.set("mastersocket", socket.id, function(err) 
      if (err) throw err;
      console.log("Master socket is now" + socket.id);
    );
  );

  socket.on("message to master", function(msg) 

    // Fetch the socket id from Redis
    client.get("mastersocket", function(err, socketId) 
      if (err) throw err;
      io.sockets.socket(socketId).emit(msg);
    );
  );

);

Omití el código de agrupamiento aquí, porque lo hace más desordenado, pero es trivial agregarlo. Simplemente agregue todo al código del trabajador. Más documentos aquí http://nodejs.org/api/cluster.html

cada socket se une a una habitación con una identificación de socket para un nombre, por lo que solo puede

io.to(socket#id).emit('hey')

documentos: http://socket.io/docs/rooms-and-namespaces/#default-room

Salud

Bueno, tienes que agarrar al cliente para eso (sorpresa), puedes ir de la manera simple:

var io = io.listen(server);
io.clients[sessionID].send()

Que puede romperse, lo dudo, pero siempre existe la posibilidad de que io.clients podría cambiar, así que use lo anterior con precaución

O usted mismo realiza un seguimiento de los clientes, por lo tanto, los agrega a su propio clients objeto en el connection oyente y eliminarlos en el disconnect oyente.

Usaría el último, ya que dependiendo de su aplicación, es posible que desee tener más estado en los clientes de todos modos, así que algo como clients[id] = conn: clientConnect, data: ... podría hacer el trabajo.

valoraciones y comentarios

Puedes añadir valor a nuestro contenido informacional aportando tu experiencia en las observaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *