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?

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);
});

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


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
    }));
}

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.


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.