javascript - Cómo enviar un mensaje a un cliente en particular con socket.io
jquery ajax (5)
Estoy comenzando con socket.io + node.js, sé cómo enviar un mensaje localmente y transmitir la función socket.broadcast.emit()
: - todos los clientes conectados reciben el mismo mensaje.
Ahora, me gustaría saber cómo enviar un mensaje privado a un cliente en particular, me refiero a un socket para un chat privado entre 2 personas (flujo de Cliente a Cliente). Gracias.
Cuando un usuario se conecta, debe enviar un mensaje al servidor con un nombre de usuario que debe ser único, como un correo electrónico.
Un par de nombre de usuario y socket deben almacenarse en un objeto como este:
var users = {
''[email protected]'': [socket object],
''[email protected]'': [socket object],
''[email protected]'': [socket object]
}
En el cliente, emita un objeto al servidor con los siguientes datos:
{
to:[the other receiver''s username as a string],
from:[the person who sent the message as string],
message:[the message to be sent as string]
}
En el servidor, escucha los mensajes. Cuando se recibe un mensaje, emita los datos al receptor.
users[data.to].emit(''receivedMessage'', data)
En el cliente, escuche las emi- siones del servidor llamadas ''receivedMessage'' y, al leer los datos, puede saber de quién proceden y el mensaje que se envió.
En un proyecto de nuestra empresa estamos utilizando el enfoque de "salas" y su nombre es una combinación de identificadores de usuario de todos los usuarios en una conversación como un identificador único (nuestra implementación es más como Facebook Messenger), ejemplo:
| id | nombre | 1 | Scott | 2 | Susana
El nombre de la "habitación" será "1-2" (los identificadores se ordenan como Asc.) y al desconectarse socket.io automáticamente limpiará la habitación.
de esta forma, envía mensajes solo a esa sala y solo a usuarios en línea (conectados) (menos paquetes enviados a través del servidor).
Puede consultar las rooms socket.io. Cuando conectas el zócalo, puedes unirte a él en una sala con nombre, por ejemplo, "user. # {Userid}".
Después de eso, puede enviar un mensaje privado a cualquier cliente con un nombre conveniente, por ejemplo:
io.sockets.in (''user.125''). emit (''new_message'', {text: "Hello world"})
En la operación anterior, enviamos "nuevo_mensaje" al usuario "125".
Gracias.
Puede usar las salas socket.io. Desde el lado del cliente, emita un evento ("join" en este caso, puede ser cualquier cosa) con cualquier identificador único (email, id).
Lado del cliente:
var socket = io.connect(''http://localhost'');
socket.emit(''join'', {email: [email protected]});
Ahora, desde el lado del servidor, use esa información para crear una sala única para ese usuario
Lado del servidor:
var io = require(''socket.io'').listen(80);
io.sockets.on(''connection'', function (socket) {
socket.on(''join'', function (data) {
socket.join(data.email); // We are using room of socket io
});
});
Entonces, ahora cada usuario se ha unido a una sala que lleva el nombre del correo electrónico del usuario. Entonces, si desea enviar un mensaje específico a un usuario, solo tiene que
Lado del servidor:
io.sockets.in(''[email protected]'').emit(''new_msg'', {msg: ''hello''});
Lo último que queda por hacer en el lado del cliente es escuchar el evento "new_msg".
Lado del cliente:
socket.on("new_msg", function(data) {
alert(data.msg);
}
Espero que captes la idea.
SEGURO: Simplemente,
Esto es lo que necesitas :
io.to(socket.id).emit("event", data);
cada vez que un usuario se une al servidor, se generarán los detalles del socket, incluida la ID. Esta es la ID realmente ayuda a enviar un mensaje a personas particulares.
primero tenemos que almacenar todos los socket.ids en array,
var people={};
people[name] = socket.id;
aquí nombre es el nombre del receptor. Ejemplo:
people["ccccc"]=2387423cjhgfwerwer23;
Entonces, ahora podemos obtener ese socket.id con el nombre del receptor cada vez que estamos enviando un mensaje:
para esto necesitamos saber el nombre del receptor. Necesita emitir el nombre del receptor al servidor.
Lo último es:
socket.on(''chat message'', function(data){
io.to(people[data.receiver]).emit(''chat message'', data.msg);
});
Espero que esto funcione bien para ti.
¡¡Buena suerte!!