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

133

Was ist der Unterschied zwischen diesen beiden?

Ich habe festgestellt, dass der Server die Nachricht nicht empfangen konnte , wenn ich in einem Arbeitsprogramm von socket.emitzu geändert habe socket.send, obwohl ich nicht verstehe, warum.

Ich habe auch festgestellt, dass der Server in meinem Programm beim Wechsel von socket.emitzu socket.sendeine Nachricht empfängt, diese jedoch anscheinend mehrmals empfängt. Wenn ich console.log()sehe, was der Server empfangen hat, wird etwas anderes angezeigt als bei der Verwendung socket.emit.

Warum dieses Verhalten? Woher weißt du, wann socket.emitoder socket.send?

Knoten Ninja
quelle

Antworten:

123

Mit socket.emit können Sie ein benutzerdefiniertes Ereignis wie folgt registrieren:

Server:

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

Klient:

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

Socket.send macht dasselbe, aber Sie registrieren sich nicht bei 'news', sondern bei message:

Server:

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

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

Klient:

var socket = io.connect('http://localhost');
socket.on('message', function (message) {
  console.log(message);
});
Charles
quelle
3
Es scheint kein großer Unterschied zu sein. Es sieht so aus, als ob socket.emit () alles kann, was socket.on () kann. Warum mussten sie diese Funktion machen?
Knoten Ninja
2
Ich weiß nicht, ich habe den Quellcode überprüft und sie machen fast das gleiche ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Vielleicht ist es historisch und nur aus Gründen der Abwärtskompatibilität.
Charles
37
Beachten Sie auch, zukünftige Leser dieses Beitrags, dass es sich um socket.io handelt, nicht um node.js TCP-, UDP- oder Unix-Sockets.
Aredridel
3
Ist es möglich, mit Vanille-Javascript-Websockets zu emittieren?
Alex Buznik
11
Sieht aus wie socket.sendist einfach nur ein Alias ​​fürsocket.emit('message', message);
Mohit Gangrade
92

Einfach und präzise (Quelle: Socket.IO Google Group ):

socket.emit Mit dieser Option können Sie benutzerdefinierte Ereignisse auf dem Server und dem Client ausgeben

socket.sendsendet Nachrichten, die mit dem 'message'Ereignis empfangen werden

MD
quelle
45

TL; DR:

socket.send(data, callback) ist im Wesentlichen gleichbedeutend mit anrufen socket.emit('message', JSON.stringify(data), callback)

Ohne den Quellcode zu betrachten, würde ich annehmen, dass die Sendefunktion effizienter bearbeitet wird: zumindest zum Senden von String-Nachrichten ?

Im Grunde genommen können Sie mit emit Objekte senden, was sehr praktisch ist.

Nehmen Sie dieses Beispiel mit socket.emit:

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

und für diejenigen, die zu Hause punkten, sieht es so aus socket.send:

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

socket.sendwird aus Gründen der Kompatibilität mit der Vanilla WebSocket-Schnittstelle implementiert. socket.emitist nur eine Funktion von Socket.IO. Beide tun dasselbe, sind jedoch socket.emitbeim Umgang mit Nachrichten etwas bequemer.

artch
quelle
socket.emit ist nicht auf Socket.IO beschränkt, sondern funktioniert auch im Netz.
Ajay
0

In einfachen Zwei-Wege-Kommunikationssystemen hat sich socket.emit als überzeugender und benutzerfreundlicher erwiesen (persönliche Erfahrung) und ist Teil von Socket.IO, das hauptsächlich für solche Zwecke entwickelt wurde

Krishna Ganeriwal
quelle