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?

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

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


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

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.


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.