socket javascript node.js socket.io

javascript - socket.io: enviar mensaje a una sala específica(lado del cliente)



socket io server (2)

En socket.io, usualmente 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 que el código relacionado con socket.io que se ejecuta en un navegador) indica 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 ofrece también una sintaxis específica para este propósito?

Edición: para aclarar, mi sugerencia de arriba parece funcionar, pero no estoy seguro de que haya una solución mejor.


La solución de Alapeno era que el cliente enviara una sala específica como parte de los datos del mensaje al servidor, de modo 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 su cuenta a través del objeto socket.rooms . Por lo tanto, no necesitaría que el cliente envíe el nombre de su sala como parte del mensaje como indicó.

Client.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 un tipo de hash como el ejemplo a continuación, por lo que es mejor enviar a todas las habitaciones en socket.rooms para asegurarse de que los miembros de la sala lo reciban. No se puede garantizar el orden de las llaves.

Ejemplo:

socket.rooms[keys[0]]) = WMWlX-ekAxa8hP8FAAAE

socket.rooms[keys[1]]) = app-chat-room


Usted casi lo ha descubierto. Solo el servidor puede emitir a salas específicas, ya que 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. Por lo tanto, si desea que la aplicación de su 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. 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é habitación (s) debe transmitir el servidor. Sin embargo, probablemente se prefiera el primero (de emisión), 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).