socket.emit () vs. socket.send ()

133

¿Cuál es la diferencia entre estos dos?

Noté que si cambiaba de socket.emita socket.sendun programa de trabajo, el servidor no recibía el mensaje, aunque no entiendo por qué.

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

¿Por qué este comportamiento? ¿Cómo sabes cuándo usar socket.emito socket.send?

nodo ninja
fuente

Respuestas:

123

Con socket.emit puedes registrar eventos personalizados como ese:

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 se registra en 'news' sino en 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);
});
Charles
fuente
3
No parece una gran diferencia. Parece que socket.emit () puede hacer todo lo que socket.on () puede. ¿Por qué tuvieron que hacer esa función?
nodo ninja
2
No sé, verifiqué el código fuente y hacen casi lo mismo ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Tal vez sea histórico y solo por compatibilidad con versiones anteriores.
Charles
37
También tengan en cuenta, futuros lectores de esta publicación, que se trata de socket.io, no de sockets TCP, UDP o Unix de node.js.
aredridel
3
¿Es posible emitir con vainilla javascript Websockets?
Alex Buznik
11
Parece que socket.sendes simplemente un alias parasocket.emit('message', message);
Mohit Gangrade
92

Simple y preciso (Fuente: grupo de google Socket.IO ):

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

socket.sendenvía mensajes que se reciben con el 'message'evento

Maryland
fuente
45

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 una edición más eficiente : ¿al menos para enviar mensajes de cadena ?

Así que, básicamente, emitir le permite enviar objetos, lo cual 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, esto es lo que parece usar socket.send:

sendMessage: function(type, message) {
    socket.send(JSON.stringify({
        type: type,
        message: message
    }));
}
Kyle Shay
fuente
27

socket.sendestá implementado para compatibilidad con la interfaz vanilla WebSocket. socket.emites una característica de Socket.IO solamente. Ambos hacen lo mismo, pero socket.emites un poco más conveniente en el manejo de mensajes.

artch
fuente
socket.emit no se limita a Socket.IO sino que también funciona en la red.
Ajay
0

En los sistemas básicos de comunicación bidireccional, socket.emit ha demostrado ser más convincente y fácil de usar (experiencia personal) y es parte de Socket.IO, que está construido principalmente para tales fines.

Krishna Ganeriwal
fuente