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 ทำเช่นเดียวกัน แต่คุณไม่ได้ลงทะเบียน '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);
});

3
ดูเหมือนจะไม่แตกต่างกันมาก จะเห็นว่า socket.emit () สามารถทำทุกอย่างที่ socket.on () ทำได้ ทำไมพวกเขาถึงต้องทำหน้าที่นั้น?
node ninja

2
ฉันไม่รู้ฉันตรวจสอบซอร์สโค้ดและพวกมันเกือบจะเหมือนกัน ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ) บางทีมันอาจจะเป็นเรื่องทางประวัติศาสตร์และเพื่อความเข้ากันได้แบบย้อนหลัง
Charles

37
โปรดทราบว่าผู้อ่านในอนาคตของโพสต์นี้เกี่ยวกับ socket.io ไม่ใช่ node.js TCP, UDP หรือ Unix sockets
aredridel

3
เป็นไปได้ไหมที่จะปล่อยด้วย vanilla javascript Websockets
Alex Buznik

11
ดูเหมือนsocket.sendจะเป็นเพียงนามแฝงของsocket.emit('message', message);
Mohit Gangrade

92

ง่ายและแม่นยำ (ที่มา: กลุ่ม Socket.IO google ):

socket.emit อนุญาตให้คุณปล่อยเหตุการณ์ที่กำหนดเองบนเซิร์ฟเวอร์และไคลเอนต์

socket.sendส่งข้อความที่ได้รับจาก'message'เหตุการณ์


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ถูกนำไปใช้เพื่อความเข้ากันได้กับอินเทอร์เฟซ Vanilla WebSocket socket.emitเป็นคุณสมบัติของ Socket.IO เท่านั้น ทั้งคู่ทำเหมือนกัน แต่socket.emitสะดวกกว่าเล็กน้อยในการจัดการข้อความ


socket.emit ไม่ จำกัด เฉพาะ Socket.IO แต่ใช้งานได้บนเน็ตด้วย
Ajay

0

ในระบบการสื่อสารสองทางพื้นฐาน socket.emit ได้พิสูจน์แล้วว่าน่าเชื่อถือและใช้งานง่าย (ประสบการณ์ส่วนตัว) และเป็นส่วนหนึ่งของ Socket.IO ซึ่งส่วนใหญ่สร้างขึ้นเพื่อวัตถุประสงค์ดังกล่าว


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.