2012-07-16 19 views
88

¿Cuál es la diferencia entre estos dos?socket.emit() vs. socket.send()

Me di cuenta de que si cambiaba de socket.emit a socket.send en un programa en funcionamiento, el servidor no recibía el mensaje, aunque no entiendo por qué.

También noté que en mi programa si cambiaba de socket.emit a socket.send, el servidor recibe un mensaje, pero parece que lo recibe varias veces. Cuando uso console.log() para ver lo que el servidor recibió, muestra algo diferente de cuando uso socket.emit.

¿Por qué este comportamiento? ¿Cómo sabe cuándo usar socket.emit o socket.send?

Respuesta

92

Con socket.emit puede registrar eventos personalizado así:

servidor:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

cliente:

var socket = io.connect('http://localhost'); 
socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
}); 

Socket.send hace lo mismo, pero no lo hacen registrarse en 'noticias' pero en el mensaje:

servidor:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.send('hi'); 
}); 

cliente:

var socket = io.connect('http://localhost'); 
socket.on('message', function (message) { 
    console.log(message); 
}); 
+2

No parece una gran diferencia. Se ve como socket.emit() puede hacer todo lo que socket.on() puede. ¿Por qué tenían que hacer esa función? –

+2

No sé, revisé el código fuente y hacen casi lo mismo (https://github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318). Tal vez es histórico y solo por compatibilidad con versiones anteriores. – Charles

+1

socket.io hace que emitir() haga algo diferente a lo que hace EventEmitter's emit() es desconcertante, ¿no? Es un protocolo en la parte superior de los pseudosockets en bruto que aparecen como eventos denominados en el lado opuesto, en lugar de mensajes sin formato. Le permite usar un solo socket para múltiples transmisiones, en cierto sentido, multiplexarlas. – aredridel

20

socket.send se implementa para la compatibilidad con la interfaz de vainilla WebSocket. socket.emit es una característica de Socket.IO solamente. Ambos hacen lo mismo, pero socket.emit es un poco más conveniente en el manejo de mensajes.

+0

socket.emit no está limitado a Socket.IO sino que también funciona en la red. – ajay

54

simple y preciso (Fuente: Socket.IO google group):

socket.emit le permite emitir sucesos personalizados en el servidor y el cliente

socket.send envía mensajes que se reciben con el 'message' caso

38

TL; DR :

socket.send(data, callback) es esencialmente equivalente a llamar socket.emit('message', JSON.stringify(data), callback)

Sin mirar el código fuente, supongo que la función de envío es más eficiente editar: ¿para enviar mensajes de cadena, al menos?

Entonces, básicamente, la emisión le permite enviar objetos, lo que es muy útil.

Tome este ejemplo con socket.emit:

sendMessage: function(type, message) { 
    socket.emit('message', { 
     type: type, 
     message: message 
    }); 
} 

y para aquellos que llevan la cuenta en casa, aquí es lo que parece que el uso de socket.send:

sendMessage: function(type, message) { 
    socket.send(JSON.stringify({ 
     type: type, 
     message: message 
    })); 
} 
0

En dos sistemas básicos de comunicación bidireccional, zócalo.emitir ha demostrado ser más convincente y fácil de usar (experiencia personal) y es parte de Socket.IO que está principalmente diseñado para tales fines

Cuestiones relacionadas