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.
aredridel

3
Чи можна випускати веб-розетки ванільного javascript?
Олексій Бузник

11
Схоже, socket.sendце просто лише псевдонім дляsocket.emit('message', message);
Mohit Gangrade


45

TL; DR:

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

Не дивлячись на вихідний код, я б припустив, що функція надсилання є більш ефективною редагуванням: принаймні для надсилання рядкових повідомлень ?

Так що так, в основному випромінювання дозволяє надсилати об'єкти, що дуже зручно.

Візьмемо цей приклад із 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реалізовано для сумісності з ванільним інтерфейсом WebSocket. socket.emitє лише функцією Socket.IO. Вони обидва роблять те ж саме, але socket.emitтрохи зручніше в обробці повідомлень.


socket.emit не обмежується Socket.IO, але працює і в мережі.
Аджай

0

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.