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
?
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);
});
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'
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
}));
}
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.
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
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.