socket.emit () contre socket.send ()

133

Quelle est la différence entre ces deux?

J'ai remarqué que si je passais de socket.emità socket.senddans un programme de travail, le serveur ne recevait pas le message, même si je ne comprends pas pourquoi.

J'ai également remarqué que dans mon programme, si je passe de socket.emità socket.send, le serveur reçoit un message, mais il semble le recevoir plusieurs fois. Quand j'utilise console.log()pour voir ce que le serveur a reçu, cela montre quelque chose de différent de quand j'utilise socket.emit.

Pourquoi ce comportement? Comment savez-vous quand utiliser socket.emitou socket.send?

noeud ninja
la source

Réponses:

123

Avec socket.emit, vous pouvez enregistrer un événement personnalisé comme celui-ci:

serveur:

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

client:

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

Socket.send fait la même chose, mais vous ne vous inscrivez pas à 'news' mais au message:

serveur:

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

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

client:

var socket = io.connect('http://localhost');
socket.on('message', function (message) {
  console.log(message);
});
Charles
la source
3
Cela ne semble pas être une très grande différence. Il voit que socket.emit () peut faire tout ce que socket.on () peut faire. Pourquoi ont-ils dû faire cette fonction?
node ninja
2
Je ne sais pas, j'ai vérifié le code source et ils font presque la même chose ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). C'est peut-être historique et juste pour la rétrocompatibilité.
Charles
37
Sachez également, futurs lecteurs de cet article, qu'il s'agit de socket.io, pas de sockets node.js TCP, UDP ou Unix.
aredridel
3
Est-il possible d'émettre avec des Websockets javascript vanille?
Alex Buznik
11
On dirait que socket.sendc'est simplement un alias poursocket.emit('message', message);
Mohit Gangrade
92

Simple et précis (Source: groupe google Socket.IO ):

socket.emit vous permet d'émettre des événements personnalisés sur le serveur et le client

socket.sendenvoie les messages reçus avec l' 'message'événement

MARYLAND
la source
45

TL; DR:

socket.send(data, callback) équivaut essentiellement à appeler socket.emit('message', JSON.stringify(data), callback)

Sans regarder le code source, je suppose que la fonction d'envoi est plus efficace edit: pour l'envoi de messages string, au moins ?

Donc ouais, émettre vous permet d'envoyer des objets, ce qui est très pratique.

Prenons cet exemple avec socket.emit:

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

et pour ceux qui tiennent le score à la maison, voici à quoi cela ressemble en utilisant socket.send:

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

socket.sendest implémenté pour la compatibilité avec l'interface WebSocket vanilla. socket.emitest une fonctionnalité de Socket.IO uniquement. Ils font tous les deux la même chose, mais socket.emitc'est un peu plus pratique pour gérer les messages.

artch
la source
socket.emit n'est pas limité à Socket.IO mais fonctionne également sur le net.
Ajay le
0

Dans les systèmes de communication bidirectionnels de base, socket.emit s'est avéré plus convaincant et facile à utiliser (expérience personnelle) et fait partie de Socket.IO qui est principalement conçu à ces fins.

Krishna Ganeriwal
la source