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


133

Qual è la differenza tra questi due?

Ho notato che se sono passato da socket.emita socket.sendin un programma funzionante, il server non è riuscito a ricevere il messaggio, anche se non capisco perché.

Ho anche notato che nel mio programma, se sono passato da socket.emita socket.send, il server riceve un messaggio, ma sembra riceverlo più volte. Quando uso console.log()per vedere cosa ha ricevuto il server, mostra qualcosa di diverso rispetto a quando lo uso socket.emit.

Perché questo comportamento? Come fai a sapere quando usare socket.emito socket.send?

Risposte:


123

Con socket.emit puoi registrare un evento personalizzato come questo:

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

cliente:

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

Socket.send fa lo stesso, ma non ti registri a "news" ma a un messaggio:

server:

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
Non sembra una grande differenza. Vede come socket.emit () può fare tutto ciò che socket.on () può fare. Perché hanno dovuto fare quella funzione?
nodo ninja

2
Non lo so, ho controllato il codice sorgente e fanno quasi lo stesso ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Forse è storico e solo per compatibilità all'indietro.
Charles,

37
Inoltre, i futuri lettori di questo post sono consapevoli che si tratta di socket socket.io, non node.js TCP, UDP o Unix.
Aredridel,

3
È possibile emettere con Websocket vaniglia javascript?
Alex Buznik,

11
Sembra socket.sendsemplicemente un alias persocket.emit('message', message);
Mohit Gangrade,

92

Semplice e preciso (fonte: gruppo Google Socket.IO ):

socket.emit consente di emettere eventi personalizzati sul server e sul client

socket.sendinvia messaggi che vengono ricevuti con l' 'message'evento


45

TL; DR:

socket.send(data, callback) è essenzialmente equivalente a chiamare socket.emit('message', JSON.stringify(data), callback)

Senza guardare il codice sorgente, suppongo che la funzione di invio sia più efficiente di modifica: almeno per l'invio di messaggi stringa ?

Quindi sì, in pratica l'emissione ti consente di inviare oggetti, il che è molto utile.

Prendi questo esempio con socket.emit:

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

e per coloro che mantengono il punteggio a casa, ecco come appare usando socket.send:

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

27

socket.sendè implementato per la compatibilità con l'interfaccia WebSocket vaniglia. socket.emitè solo una funzione di Socket.IO. Entrambi fanno lo stesso, ma socket.emitè un po 'più conveniente nella gestione dei messaggi.


socket.emit non è limitato a Socket.IO ma funziona anche su rete.
Ajay,

0

Nei sistemi di comunicazione bidirezionali di base, socket.emit si è dimostrato più convincente e facile da usare (esperienza personale) ed è una parte di Socket.IO che è principalmente costruito per tali scopi


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.