socket.emit () so với socket.send ()


133

Sự khác biệt giữa hai điều này là gì?

Tôi nhận thấy rằng nếu tôi thay đổi từ socket.emitđến socket.sendtrong một chương trình làm việc, máy chủ thất bại trong việc nhận được thông báo, mặc dù tôi không hiểu tại sao.

Tôi cũng nhận thấy rằng trong chương trình của tôi nếu tôi thay đổi từ socket.emitthành socket.send, máy chủ sẽ nhận được một tin nhắn, nhưng dường như nó nhận được nhiều lần. Khi tôi sử dụng console.log()để xem những gì máy chủ nhận được, nó hiển thị một cái gì đó khác với khi tôi sử dụng socket.emit.

Tại sao lại có hành vi này? Làm thế nào để bạn biết khi nào nên sử dụng socket.emithoặc socket.send?

Câu trả lời:


123

Với socket.emit bạn có thể đăng ký sự kiện tùy chỉnh như thế:

người phục vụ:

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

khách hàng

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

Socket.send cũng làm như vậy, nhưng bạn không đăng ký 'tin tức' mà để nhắn tin:

người phục vụ:

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

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

khách hàng

var socket = io.connect('http://localhost');
socket.on('message', function (message) {
  console.log(message);
});

3
Nó dường như không phải là một sự khác biệt rất lớn. Nó thấy như socket.emit () có thể làm mọi thứ mà socket.on () có thể. Tại sao họ phải thực hiện chức năng đó?
nút ninja

2
Tôi không biết, tôi đã kiểm tra mã nguồn và chúng tạo ra gần như giống nhau ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Có lẽ đó là lịch sử và chỉ để tương thích ngược.
Charles

37
Cũng cần lưu ý, những người đọc tương lai của bài đăng này, rằng đây là về socket.io, không phải socket.js TCP, UDP hoặc Unix.
aredridel

3
Có thể phát ra với Websockets vanilla javascript không?
Alex Buznik

11
Hình như socket.sendchỉ đơn giản là một bí danh chosocket.emit('message', message);
Mohit Gangrade

92

Đơn giản và chính xác (Nguồn: nhóm google. Socket.IO ):

socket.emit cho phép bạn phát các sự kiện tùy chỉnh trên máy chủ và máy khách

socket.sendgửi tin nhắn nhận được với 'message'sự kiện


45

TL; DR:

socket.send(data, callback) về cơ bản là tương đương với gọi socket.emit('message', JSON.stringify(data), callback)

Nếu không nhìn vào mã nguồn, tôi sẽ cho rằng chức năng gửi là chỉnh sửa hiệu quả hơn : ít nhất là để gửi tin nhắn chuỗi ?

Vì vậy, yeah về cơ bản phát ra cho phép bạn gửi các đối tượng, rất tiện dụng.

Lấy ví dụ này với socket.emit:

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

và đối với những người giữ điểm ở nhà, đây là cách sử dụng socket.send:

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

27

socket.sendđược triển khai để tương thích với giao diện WebSocket của vanilla. socket.emitchỉ là tính năng của Socket.IO. Cả hai đều làm như vậy, nhưng socket.emitthuận tiện hơn một chút trong việc xử lý tin nhắn.


socket.emit không giới hạn ở Socket.IO nhưng cũng hoạt động trên mạng.
Ajay

0

Trong các hệ thống giao tiếp hai chiều cơ bản, socket.emit đã được chứng minh là có sức thuyết phục và dễ sử dụng hơn (trải nghiệm cá nhân) và là một phần của Socket.IO được xây dựng chủ yếu cho các mục đích như vậy


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.