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

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

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

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

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

Ответ 1

С помощью 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 делает то же самое, но вы не регистрируетесь в 'news', а в сообщении:

Сервер:

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

Ответ 2

Простой и точный (Источник: Группа Google Socket.IO):

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

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

Ответ 3

TL; ДР:

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

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

Итак, да, в основном, 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
    }));
}

Ответ 4

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

Ответ 5

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