socket.emit () против socket.send ()

133

В чем разница между этими двумя?

Я заметил, что, если я изменил с socket.emitна socket.sendв рабочей программе, серверу не удалось получить сообщение, хотя я не понимаю, почему.

Я также заметил, что в моей программе, если я изменил с socket.emitна socket.send, сервер получает сообщение, но, похоже, получает его несколько раз. Когда я использую, console.log()чтобы увидеть, что сервер получил, он показывает что-то отличное от того, когда я использую socket.emit.

Почему это поведение? Как вы знаете, когда использовать socket.emitили socket.send?

узел ниндзя
источник

Ответы:

123

С помощью socket.emit вы можете зарегистрировать пользовательское событие следующим образом:

сервер:

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

клиент:

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

Socket.send делает то же самое, но вы регистрируетесь не на «новости», а на сообщение:

сервер:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.send('hi');
});

клиент:

var socket = io.connect('http://localhost');
socket.on('message', function (message) {
  console.log(message);
});
Чарльз
источник
3
Это не кажется большой разницей. Он видит, как socket.emit () может делать все, что умеет socket.on (). Почему они должны были сделать эту функцию?
узел ниндзя
2
Я не знаю, я проверил исходный код, и они делают почти то же самое ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Может быть, это исторически и просто для обратной совместимости.
Чарльз
37
Также учтите, будущие читатели этого поста, что речь идет о socket.io, а не о node.js TCP, UDP или Unix сокетах.
Аредридель
3
Можно ли излучать с ванильным javascript Websockets?
Алекс Бузник
11
Похоже, socket.sendэто просто псевдоним дляsocket.emit('message', message);
Мохит Ганград
92

Просто и точно (Источник: Socket.IO google group ):

socket.emit позволяет создавать пользовательские события на сервере и клиенте

socket.sendотправляет сообщения, полученные с 'message'событием

Мэриленд
источник
45

TL; DR:

socket.send(data, callback) по сути эквивалентно вызову socket.emit('message', JSON.stringify(data), callback)

Не глядя на исходный код, я бы предположил, что функция send более эффективна для редактирования: по крайней мере, для отправки строковых сообщений ?

Так что да, в принципе, Emit позволяет отправлять объекты, что очень удобно.

Возьмите этот пример с socket.emit:

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

и для тех, кто ведет счет дома, вот как это выглядит socket.send:

sendMessage: function(type, message) {
    socket.send(JSON.stringify({
        type: type,
        message: message
    }));
}
Кайл Шей
источник
27

socket.sendреализован для совместимости с интерфейсом vanilla WebSocket. socket.emitэто особенность Socket.IO только. Они оба делают то же самое, но socket.emitнемного удобнее в обработке сообщений.

artch
источник
socket.emit не ограничивается Socket.IO, но работает и в сети.
Ajay
0

В базовых системах двусторонней связи socket.emit оказался более убедительным и простым в использовании (личный опыт) и является частью Socket.IO, который в первую очередь создан для таких целей.

Кришна Ганеривал
источник