socket.emit () kontra socket.send ()

136

Jaka jest różnica między tymi dwoma?

Zauważyłem, że jeśli zmieniłem z socket.emitna socket.sendw działającym programie, serwer nie otrzymał wiadomości, chociaż nie rozumiem dlaczego.

Zauważyłem również, że w moim programie, jeśli zmieniłem z socket.emitna socket.send, serwer otrzymuje wiadomość, ale wydaje się, że otrzymuje ją wielokrotnie. Kiedy używam, console.log()aby zobaczyć, co otrzymał serwer, pokazuje coś innego niż wtedy, gdy używam socket.emit.

Dlaczego to zachowanie? Skąd wiesz, kiedy użyć socket.emitlub socket.send?

węzeł ninja
źródło

Odpowiedzi:

126

Z socket.emit możesz zarejestrować takie zdarzenie niestandardowe:

serwer:

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 robi to samo, ale nie rejestrujesz się w 'newsach', ale na wiadomości:

serwer:

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
źródło
3
Wydaje się, że nie jest to duża różnica. Widzi, że socket.emit () może zrobić wszystko, co gniazdo.on (). Dlaczego musieli wykonać tę funkcję?
węzeł ninja,
2
Nie wiem, sprawdziłem kod źródłowy i robią prawie to samo ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Może to historyczne i tylko dla wstecznej kompatybilności.
Charles,
37
Należy również pamiętać, przyszli czytelnicy tego postu, że dotyczy to gniazd.io, a nie gniazd node.js TCP, UDP lub Unix.
aredridel
3
Czy można emitować za pomocą zwykłych gniazd internetowych javascript?
Alex Buznik
12
Wygląda na socket.sendto, że to tylko alias dlasocket.emit('message', message);
Mohit Gangrade,
94

Prosty i precyzyjny (źródło: grupa google Socket.IO ):

socket.emit umożliwia emitowanie niestandardowych zdarzeń na serwerze i kliencie

socket.sendwysyła wiadomości otrzymane wraz ze 'message'zdarzeniem

MD
źródło
45

TL; DR:

socket.send(data, callback) jest zasadniczo równoważne z dzwonieniem socket.emit('message', JSON.stringify(data), callback)

Nie patrząc na kod źródłowy, założyłbym, że funkcja wysyłania jest bardziej wydajna edycja: przynajmniej do wysyłania wiadomości tekstowych ?

Więc tak, w zasadzie emisja pozwala na wysyłanie obiektów, co jest bardzo przydatne.

Weź ten przykład z socket.emit:

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

a dla tych, którzy zapisują wyniki w domu, oto jak wygląda użycie socket.send:

sendMessage: function(type, message) {
    socket.send(JSON.stringify({
        type: type,
        message: message
    }));
}
Kyle Shay
źródło
27

socket.sendjest zaimplementowany w celu zapewnienia zgodności z podstawowym interfejsem WebSocket. socket.emitjest funkcją tylko Socket.IO. Obaj robią to samo, ale socket.emitjest nieco wygodniejszy w obsłudze wiadomości.

artch
źródło
socket.emit nie ogranicza się do Socket.IO, ale działa również w sieci.
Ajay
0

W podstawowych systemach komunikacji dwukierunkowej socket.emit okazał się bardziej przekonujący i łatwy w użyciu (osobiste doświadczenia) i jest częścią Socket.IO, który jest zbudowany głównie do takich celów

Krishna Ganeriwal
źródło