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

133

Apa perbedaan keduanya?

Saya perhatikan bahwa jika saya berubah dari socket.emit menjadisocket.send dalam program yang berfungsi, server gagal menerima pesan, meskipun saya tidak mengerti mengapa.

Saya juga memperhatikan bahwa dalam program saya jika saya beralih dari socket.emitke socket.send, server menerima pesan, tetapi tampaknya menerimanya beberapa kali. Ketika saya gunakan console.log()untuk melihat apa yang diterima server, itu menunjukkan sesuatu yang berbeda dari ketika saya menggunakannyasocket.emit .

Kenapa perilaku ini? Bagaimana Anda tahu kapan harus menggunakan socket.emitatau socket.send?

simpul ninja
sumber

Jawaban:

123

Dengan socket.emit Anda dapat mendaftarkan acara khusus seperti itu:

server:

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

klien:

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

Socket.send melakukan hal yang sama, tetapi Anda tidak mendaftar ke 'berita' tetapi ke pesan:

server:

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

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

klien:

var socket = io.connect('http://localhost');
socket.on('message', function (message) {
  console.log(message);
});
Charles
sumber
3
Sepertinya tidak ada perbedaan yang sangat besar. Itu terlihat seperti socket.emit () dapat melakukan segala sesuatu yang socket.on () bisa. Mengapa mereka harus membuat fungsi itu?
simpul ninja
2
Saya tidak tahu, saya memeriksa kode sumber dan hasilnya hampir sama ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Mungkin itu historis dan hanya untuk kompatibilitas.
Charles
37
Perlu diketahui juga, pembaca masa depan posting ini, bahwa ini adalah tentang socket.io, bukan node.js TCP, UDP atau soket Unix.
aredridel
3
Apakah mungkin untuk memancarkan dengan vanilla javascript Websockets?
Alex Buznik
11
Sepertinya socket.sendhanya sekadar alias untuksocket.emit('message', message);
Mohit Gangrade
92

Sederhana dan tepat (Sumber: grup google Socket.IO ):

socket.emit memungkinkan Anda untuk memancarkan acara khusus di server dan klien

socket.sendmengirim pesan yang diterima dengan 'message'acara tersebut

MD
sumber
45

TL; DR:

socket.send(data, callback) pada dasarnya sama dengan menelepon socket.emit('message', JSON.stringify(data), callback)

Tanpa melihat kode sumber, saya akan berasumsi bahwa fungsi kirim lebih efisien diedit: untuk mengirim pesan string, paling tidak ?

Jadi pada dasarnya ya memancarkan memungkinkan Anda untuk mengirim objek, yang sangat berguna.

Ambil contoh ini dengan socket.emit:

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

dan bagi mereka yang menjaga skor di rumah, inilah yang terlihat seperti menggunakan socket.send:

sendMessage: function(type, message) {
    socket.send(JSON.stringify({
        type: type,
        message: message
    }));
}
Kyle Shay
sumber
27

socket.senddiimplementasikan untuk kompatibilitas dengan antarmuka vanilla WebSocket. socket.emitadalah fitur dari Socket.IO saja. Mereka berdua melakukan hal yang sama, tetapi socket.emitsedikit lebih nyaman dalam menangani pesan.

artch
sumber
socket.emit tidak terbatas pada Socket.IO tetapi juga berfungsi di internet.
Ajay
0

Dalam sistem komunikasi dua arah dasar, socket.emit telah terbukti lebih meyakinkan dan mudah digunakan (pengalaman pribadi) dan merupakan bagian dari Socket.IO yang terutama dibangun untuk tujuan seperti itu.

Krishna Ganeriwal
sumber