web-dev-qa-db-fra.com

socket.emit () vs socket.send ()

Quelle est la différence entre ces deux?

J'ai remarqué que si je passais de socket.emit à socket.send dans un programme fonctionnel, le serveur ne pouvait pas recevoir le message, bien que je ne comprenne pas pourquoi.

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

Pourquoi ce comportement? Comment savoir quand utiliser socket.emit ou socket.send?

113
node ninja

Avec socket.emit, vous pouvez enregistrer un événement personnalisé de la manière suivante:

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 de même, 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);
});
104
Charles

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

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

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

70
M.D.

TL; DR:

socket.send(data, callback) est essentiellement équivalent à 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 sous forme de chaîne, au moins

Donc oui, é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 gardent le score à la maison, voici à quoi cela ressemble en utilisant socket.send:

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

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

24
artch

https://socket.io/docs/client-api/#socket-send-args-ack

socket.send // Envoie un événement de message

socket.emit(eventName[, ...args][, ack]) // vous pouvez personnaliser eventName

1
zhuxy

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

0
kg11