En socket.io, normalmente usa una sintaxis específica en el lado del servidor si desea enviar un mensaje a una sala específica: io.to(room).emit('event', 'message'); .
Pero, ¿cómo indicaría un cliente (lo que quiero decir es el código relacionado con socket.io que se ejecuta en un navegador) que un mensaje debe ir a una sala específica?
¿Es común simplemente crear algo como esto (por supuesto, el servidor tiene que evaluarlo):
socket.emit('chat message', {room: 'abc', msg: 'hello there'});¿O la biblioteca del lado del cliente socket.io también ofrece una sintaxis específica para este propósito?
editar: para aclarar, mi sugerencia de arriba parece funcionar, simplemente no estoy seguro de si hay una solución mejor.
Prácticamente lo has descubierto. Solo el servidor puede emitir a salas específicas, porque solo el servidor 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 la aplicación de su cliente indique al servidor que emita un mensaje a todos los clientes conectados a una sala determinada... eso es un diseño de API básico. Podría emitir un evento de socket, o simplemente hacer una llamada http regular a una ruta en su servidor. De cualquier manera, enviará metadatos sobre a qué sala (s) debe transmitir el servidor. Sin embargo, probablemente se prefiera el primero (emitir), 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í mismo a través del objeto socket.rooms . Por lo tanto, no necesitarías que el cliente enviara el nombre de su habitación como parte del mensaje como indicaste.
Cliente.js:
socket.emit('chat message', 'hello');Servidor.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); } }); Actualización: el objeto socket.rooms incluye una especie de hash como el ejemplo a continuación, por lo que es mejor que lo envíe a todas las salas en socket.rooms para asegurarse de que los miembros de la sala lo reciban. No se le puede garantizar el orden de las llaves.
Ejemplo:
socket.rooms[keys[0]] = WMWlX-ekAxa8hP8FAAAE
socket.rooms[keys[1]] = app-chat-room