Solución:
Prácticamente lo has descubierto. Solo el servidor puede emitir a salas específicas, porque es solo el servidor el que está realmente conectado a varios clientes. En otras palabras, los clientes no están conectados entre sí: la biblioteca del lado del cliente solo administra las comunicaciones entre ese cliente y el servidor. Entonces, si desea que su aplicación cliente le indique al servidor que emita un mensaje a todos los clientes conectados a una sala determinada … ese es el diseño básico de la API. Puede emitir un evento de socket o simplemente hacer una llamada http regular a una ruta en su servidor. De cualquier manera, enviará metadatos sobre las salas a las que debe transmitir el servidor. Sin embargo, probablemente se prefiera el primero (emisor), porque de esa manera en el lado del servidor puede usar socket.broadcast.to
para emitir a todos los clientes en la sala EXCEPTO el socket que inició la llamada (un caso de uso bastante común).
La solución de Alapeno fue que el cliente enviara una sala específica como parte de los datos del mensaje al servidor, para que el servidor supiera a qué sala transmitir el mensaje.
Sin embargo, si solo desea que el cliente envíe un mensaje a su propia habitación, puede hacer que el servidor detecte la habitación del cliente por sí solo a través del socket.rooms
objeto. Por lo tanto, no necesitaría que el cliente envíe el nombre de su habitación como parte del mensaje como usted indicó.
Client.js:
socket.emit('chat message', 'hello');
Server.js:
socket.on('chat message', function(msg){
var keys = Object.keys(socket.rooms);
for (var i = 0; i < keys.length; i++) {
io.to(socket.rooms[keys[i]]).emit('chat message', msg);
}
});
Actualizar el socket.rooms
El objeto incluye una especie de hash como el ejemplo siguiente, por lo que será mejor que lo envíe a todas las habitaciones del socket.rooms
para asegurarse de que los miembros de la sala lo reciban. No se le puede garantizar el pedido de las llaves.
Ejemplo:
socket.rooms[keys[0]] = WMWlX-ekAxa8hP8FAAAE
socket.rooms[keys[1]] = app-chat-room