Какая разница между этими двумя?
Я заметил, что если я изменил с 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, которая в основном построена для таких целей