Estoy trabajando con socket.io y node.js y hasta ahora parece bastante bueno, pero no sé cómo enviar un mensaje del servidor a un cliente específico, algo como esto:
client.send(message, receiverSessionId)
Pero tampoco el .send()
ni los .broadcast()
métodos parecen satisfacer mi necesidad.
Lo que he encontrado como una posible solución, es que el .broadcast()
método acepta como segundo parámetro una matriz de SessionIds a la que no se envía el mensaje, por lo que podría pasar una matriz con todos los SessionIds conectados en ese momento al servidor, excepto el Deseo enviar el mensaje, pero creo que debe haber una mejor solución.
¿Algunas ideas?
fuente
La respuesta de Ivo Wetzel ya no parece ser válida en Socket.io 0.9.
En resumen, ahora debe guardar
socket.id
y usario.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 pasar por procesos cruzados:
Omití el código de agrupación aquí, porque lo hace más abarrotado, pero es trivial agregarlo. Simplemente agregue todo al código del trabajador. Más documentos aquí http://nodejs.org/api/cluster.html
fuente
io.of('/mynamespace').sockets[socketID].emit(...)
(no sé si es porque estoy usando un espacio de nombres)io.sockets.socket(socket_id)
se elimina en socket.io 1.0. github.com/socketio/socket.io/issues/1618#issuecomment-46151246cada socket se une a una habitación con un ID de socket para un nombre, por lo que puede simplemente
docs: http://socket.io/docs/rooms-and-namespaces/#default-room
Salud
fuente
io.sockets.connected[socketid].emit();
. Probado con 1.4.6.La solución más simple y elegante.
Es tan fácil como:
Y eso es.
¿Pero cómo? Dame un ejemplo
Lo que todos necesitamos es, de hecho, un ejemplo completo, y eso es lo que sigue. Esto se prueba con la versión más reciente de socket.io (2.0.3) y también está usando Javascript moderno (que ya deberíamos estar usando todos).
El ejemplo consta de dos partes: un servidor y un cliente. Cada vez que un cliente se conecta, comienza a recibir del servidor un número de secuencia periódica. Se inicia una nueva secuencia para cada nuevo cliente, por lo que el servidor debe realizar un seguimiento de ellos individualmente. Ahí es donde entra en juego el "Necesito enviar un mensaje a un cliente en particular" . El código es muy simple de entender. Vamos a verlo.
Servidor
server.js
El servidor comienza a escuchar en el puerto 8000 las conexiones entrantes. Cuando llega uno, agrega ese nuevo cliente a un mapa para que pueda realizar un seguimiento de su número de secuencia. También escucha el
disconnect
evento de ese cliente , cuando lo eliminará del mapa.Cada segundo, se dispara un temporizador. Cuando lo hace, el servidor recorre el mapa y envía un mensaje a cada cliente con su número de secuencia actual. Luego lo incrementa y almacena el número nuevamente en el mapa. Eso es todo lo que hay que hacer. Pan comido.
Cliente
La parte del cliente es aún más simple. Simplemente se conecta al servidor y escucha el
seq-num
mensaje, imprimiéndolo en la consola cada vez que llega.client.js
Ejecutando el ejemplo
Instale las bibliotecas requeridas:
Ejecute el servidor:
Abra otras ventanas de terminal y genere tantos clientes como desee ejecutando:
También he preparado una esencia con el código completo aquí .
fuente
Puedes usar
// enviar mensaje solo al remitente-cliente
socket.emit('message', 'check this');
// o puede enviar a todos los oyentes, incluido el remitente
io.emit('message', 'check this');
// enviar a todos los oyentes excepto al remitente
socket.broadcast.emit('message', 'this is a message');
// o puedes enviarlo a una habitación
socket.broadcast.to('chatroom').emit('message', 'this is the message to all');
fuente
En 1.0 deberías usar:
fuente
io.sockets.connected["something"]
y suemit
método.Cualquiera que sea la versión que estemos usando si solo consolamos.log () el objeto "io" que usamos en nuestro código del nodo del lado del servidor, [por ejemplo, io.on ('conexión', función (socket) {...});] , podemos ver que "io" es solo un objeto json y hay muchos objetos secundarios donde se almacenan el id del socket y los objetos del socket.
Estoy usando socket.io versión 1.3.5, por cierto.
Si miramos en el objeto io, contiene,
aquí podemos ver los socketids "B5AC9w0sYmOGWe4fAAAA", etc. Entonces, podemos hacer,
Nuevamente, en una inspección adicional podemos ver segmentos como,
Entonces, podemos recuperar un socket desde aquí haciendo
Además, debajo del motor tenemos,
Entonces, también podemos escribir,
Entonces, supongo que podemos lograr nuestro objetivo en cualquiera de las 3 formas que enumeré anteriormente,
fuente
Puedes hacerlo
En el servidor
Y en el cliente, es muy fácil de manejar.
fuente
A partir de la versión 1.4.5, asegúrese de proporcionar un socketId correctamente prefijado en io.to (). Estaba tomando el socketId que el Cliente registró para depurar y no tenía prefijo, así que terminé buscando para siempre hasta que me enteré Por lo tanto, es posible que tenga que hacerlo así si la ID que tiene no tiene el prefijo:
fuente
io.sockets.sockets [socket.id] .emit (...) funcionó para mí en v0.9
fuente
También puede mantener referencias de clientes. Pero esto hace que tu memoria esté ocupada.
Cree un objeto vacío y configure a sus clientes en él.
luego llame a su cliente específico por id desde el objeto
fuente
Socket.IO le permite "espacio de nombres" sus sockets, lo que esencialmente significa asignar diferentes puntos finales o rutas.
Esto podría ayudar: http://socket.io/docs/rooms-and-namespaces/
fuente