tutorial socket node example node.js broadcast socket.io

node.js - node - socket.io example



socket.io-¿cómo transmitir mensajes en un espacio de nombres? (4)

De acuerdo con los ejemplos de socket.io:

Para transmitir, simplemente agrega una bandera de broadcast para emit y send llamadas a métodos. La radiodifusión significa enviar un mensaje a todos los demás, excepto el conector que lo inicia.

var io = require(''socket.io'').listen(80); io.sockets.on(''connection'', function (socket) { socket.broadcast.emit(''user connected''); });

Traté de combinar esto con la nueva función socket.io namsepace, así que obtuve esto:

var chat = ioserver.of(''/chat''); chat.on(''connection'', function (socket) { console.log(''chat connection''); socket.on(''message'', function (msg) { console.log(msg); chat.send(msg); }); });

Esto funciona bien, todos en el canal de chat (y ningún otro canal) recibe el mensaje. Pero el remitente también lo entiende. Así que traté de hacer lo siguiente:

chat.on(''connection'', function (socket) { console.log(''chat connection''); socket.on(''message'', function (msg) { console.log(msg); chat.broadcast.send(msg); }); });

y obtuve una excepción: ''No se puede llamar al método'' enviar ''de indefinido''. Ok, entonces pensé, esa transmisión es la característica de un solo socket (aunque se siente un poco raro, cómo un solo socket puede transmitirse a todos los demás ...). Así que lo intenté:

chat.on(''connection'', function (socket) { console.log(''chat connection''); socket.on(''message'', function (msg) { console.log(msg); socket.broadcast.send(msg); }); });

pero ahora era aún peor: nadie recibió el mensaje, ni siquiera el remitente. De todos modos, era lo que lógicamente esperaba: un socket no puede transmitir algo por sí mismo. Y no hay excepciones esta vez, por lo que la difusión se define para el socket.

Si lo hago:

chat.on(''connection'', function (socket) { console.log(''chat connection''); socket.on(''message'', function (msg) { console.log(msg); socket.send(msg); }); });

entonces solo el remitente original recibe el mensaje, y eso es bastante lógico: utilicé el ''envío'' del socket relacionado con el cliente.

Entonces, la pregunta es: ¿cuál es la forma correcta de usar la función de transmisión?

Tal vez el desarrollador de socket.io cometió un error y agregó la función de transmisión al objeto equivocado (como entiendo, debería ser la característica del espacio de nombres pero ahora está definido solo para el socket)?


Parece que pude resolver esto por mí mismo después de abrir una recompensa. Lo siento por eso.

De todos modos, mira si esto ayuda:

chat.on(''connection'', function (socket) { socket.on(''message'', function (msg) { socket.emit(msg); // Send message to sender socket.broadcast.emit(msg); // Send message to everyone BUT sender }); });

Sin embargo, puede ahorrar algo de ancho de banda y crear una experiencia más ágil para los usuarios si no lo reenvía al remitente. Simplemente agregue sus mensajes directamente al registro de chat y, opcionalmente, use solo auto emitir para confirmar que se recibió sin problema.


Su solución funciona si está trabajando en un entorno con evented donde los mensajes del cliente desencadenan una respuesta a todos los demás, pero no si desea que el servidor envíe mensajes a todos los clientes.

Puedes hacer esto usando io.sockets.emit :

var io = require(''socket.io'').listen(80); io.sockets.emit(''message'', { message: "Hello everyone!" });

Sin embargo, la documentación no está clara de cómo hacer esto en un espacio de nombre específico. io.sockets es solo un acceso directo a io.of('''') , como tal, puede transmitir a todos en un espacio de nombres llamando a io.of(''/namespace'').emit :

var io = require(''socket.io'').listen(80); io.of(''/admins'').emit(''message'', { message: "Hello admins!" });



var customNS = ioserver.of(''/chat''); customNS.on(''connection'', function (socket) { socket.on(''message'', function (msg) { // Send message to sender socket.emit(msg); // Send message to everyone on customNS INCLUDING sender customNS.emit(msg); // Send message to everyone on customNS BUT sender socket.broadcast.emit(msg); // Send message to everyone on ROOM chanel of customNS INCLUDING sender customNS.in(''ROOM'').emit(msg); // Send message to everyone on ROOM chanel of customNS BUT sender socket.broadcast.in(''ROOM'').emit(msg); }); });

también verifique esta respuesta Envíe la respuesta a todos los clientes excepto al remitente (Socket.io)