2012-03-23 15 views
25

Estoy tratando de implementar un sistema con dos clientes, uno de ellos envía un mensaje y el otro lo recibirá. la siguiente figura se explicará de una manera más visual:socket.io cliente que no recibe mensajes del servidor

socket.io message communication chart

Por lo tanto, el cliente 1 envía el mensaje al servidor (y esto funciona), el servidor recibe un mensaje de "empuje" y emite una mensaje "pop" que debería ser recogido por el Cliente 2. El problema aquí es que el Cliente 2 nunca recibe el mensaje "emergente". :(

Aquí está el código para todos ellos.

SERVER.JS

var app = require('express').createServer() 
    , io = require('socket.io').listen(app); 

app.listen(999); 

app.get('/webclient', function (req, res) { 
    res.sendfile(__dirname + '/web.html'); 
}); 

app.get('/mobile', function (req, res) { 
    res.sendfile(__dirname + '/mobile.html'); 
}); 

io.sockets.on('connection', function (socket) { 
//  socket.emit('pop', { hello: 'world' }); 
    socket.on('push', function (data) { 
     console.log('push received, emitting a pop'); 
     socket.emit('pop', { hello: 'world' }); 
    }); 
}); 

CLIENTE 1 (también conocido como mobile.html)

<html> 
    <head> 
     <title> 
      Mobile 
     </title> 
     <script src="/socket.io/socket.io.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js" type="text/javascript"></script> 
     <script> 
      var socket = io.connect('http://localhost:999'); 
     </script> 
    </head> 
    <body> 
     <input type="button" name="act" id="push" value="message" /> 
     <script type="text/javascript" charset="utf-8"> 
      window.addEvent('domready', function() { 
       $('push').addEvent('click', function() { 
        socket.emit('push', { hello: 'world' }); 
       }); 
      }); 
     </script> 
    </body> 
</html> 

cliente 2 (también conocido como web.html)

<script src = "/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:999'); 
    socket.on('pop', function (data) { 
    console.log(data); 
    }); 
</script> 

No puedo entender la razón por cliente 2 no recibe el mensaje de "pop", Soy bastante nuevo en Socket.IO y Node.js, en general, por lo que algunos mecánicos para mí son todavía un poco oscura , entonces me disculpo de antemano por mi noobness. :)

aplausos

-k-

+1

No tengo experiencia con socket.io, pero si no me equivoco, 'socket' se referirá al mismo socket desde el que recibió el mensaje. ¿Podría probar 'io.sockets.emit' en su lugar? – pimvdb

+0

funciona como un encanto!si quieres hacer una respuesta, puedo marcarla como correcta y obtener un +1 :) – holographix

+5

+1 para una pregunta interesante bien hecha y formateada – beny23

Respuesta

15

La función pasa a .on se llama para cada socket de hacer la inicialización (eventos etc de unión), y socket se refiere a la toma de corriente. Este será el cliente 1 cuando reciba un mensaje push, porque la función del manejador está vinculada al evento push de ese socket - enlazó esa función cuando el cliente 1 se conectó (donde socket se refiere al cliente 1).

io.sockets se refiere a todos los enchufes conectados, por lo que incluye el cliente 2 en su caso.

+1

funcionó como un amuleto, muchas gracias :) – holographix

12

Otro aspecto que se podría tener en cuenta es el uso de:

socket.broadcast.emit('push', { hello: 'world' });

que enviaría esencialmente el mensaje a todos los clientes conectados, excepto el que se originó el mensaje. Eliminar la tarea de filtrar clientes/reducir tráfico innecesario al socket de origen.

Socket.IO on GitHub - Under broadcasting.

+0

que también es interesante, pero como ahora tengo que hacer un seguimiento de mis clientes y tengo que entregar el mensaje a un cliente determinado, por lo que he logrado una solución de anteras, pero esto podría ser útil para el futuro, gracias !! – holographix

+0

Usted, señor, merece un voto positivo. ¡¡Funcionó para mí de manera excelente después de 8 horas de intentos sin resultados !! – mozcelikors

Cuestiones relacionadas