Sự khác biệt giữa io.sockets.emit và broadcast là gì?


98

Sự khác biệt giữa io.sockets.emit và socket.broadcast.emit là gì? Có phải chỉ có chương trình phát sóng đó mới được phát cho mọi người NHƯNG ổ cắm gửi nó?

Có vẻ như chúng có thể được sử dụng thay thế cho nhau:

io.sockets.on('connection', function (socket) {
  //these should do the same thing  
  io.sockets.emit('this', { receivers: 'everyone'});

  socket.broadcast.emit('this', { receivers: 'everyone but socket'}); //emits to everyone but socket
  socket.emit('this', { receivers: 'socket'}); //emits to socket
});

Câu trả lời:


174

io.sockets.emit sẽ gửi cho tất cả các khách hàng

socket.broadcast.emit sẽ gửi tin nhắn cho tất cả các máy khách khác ngoại trừ kết nối mới được tạo

Bài đăng trên Wiki Socket.IO này sẽ giúp mọi người đọc câu hỏi này:


22
cũng đã mất 3 giờ quay phim khó khăn để tìm ra.
Petrogad

Tôi có thể xác minh đây thực sự là hành vi, nhưng tôi không thể xem bất kỳ tài liệu nào về socket.broadcast cũng như socket.broadcast.emit trong tài liệu Github cũng như trên trang web Socket.io . Tui bỏ lỡ điều gì vậy? (và wiki đã biến mất)
scipilot

1
Điều "tốt hơn" về điều này là ứng dụng "trò chuyện" ví dụ sử dụng gần như độc quyền socket.broadcast.emittrong khi API đó không bao giờ được ghi lại ở bất kỳ đâu.
Avi Cherry

@Sobiaholic Tôi vẫn chưa tìm ra lý do rõ ràng cho việc không phát ra thay đổi đối với kết nối hiện tại. Có phải là khi khách hàng kích hoạt sự kiện đã cập nhật trước một cách lạc quan không?
Nick Pineda

2
Nó không phải là "ngoại trừ các kết nối mới được tạo", nó phải là "cho tất cả các máy khách khác ngoại trừ chính nó". Bạn có thể có một kết nối mới được tạo (một khách hàng tham gia phòng trò chuyện) và bạn gửi tin nhắn bằng cách sử dụng socket.broadcast.emitvà họ sẽ nhận được, nhưng không phải bạn.
NiCk Newman

47

socket.broadcast.emit()hoạt động tương tự io.sockets.emit, nhưng thay vì phát ra cho tất cả các ổ cắm được kết nối, nó sẽ phát ra tất cả các ổ cắm được kết nối ngoại trừ ổ cắm mà nó đang được gọi. Vì vậy, trong trường hợp này, socket được tham chiếu bởi socketsẽ không nhận được sự kiện.


6
một bản cập nhật nữa - theo câu trả lời của Jayantha và phân tích của riêng tôi, nó cũng KHÔNG phát ra các kết nối mới được tạo tức là các kết nối máy khách mới được tạo sau khi 'socket' được tạo. Đây là một sự khác biệt quan trọng và then chốt !!
Anmol Saraf

6
"Kết nối mới được tạo" mà Jayantha đề cập đến là ổ cắm có sự kiện kết nối đang được xử lý và ai sẽ phát hành chương trình phát sóng. Điểm của phát sóng là nó đi đến mọi máy khách ngoại trừ ổ cắm 'phát sóng' - thứ tự mà các kết nối máy khách được thiết lập không có gì khác biệt.
Dấu chấm phẩy

8

Kịch bản: 1: - Bằng cách sử dụng io.sockets.emit Sơ đồ chi tiết: -io.sockets.emit

Ở đây Mỗi Socket nhận được Thông báo bao gồm cả Trình khởi xướng .

  // BY IO>SOCKETS>EMIT
   io.sockets.emit('MyChannelBroadcast',
               {
                 owner:"Anshu Ashish",
                 clientCount:clients,
                 message:"Welcome All"
               }
    );

Kịch bản: 2: - Bằng việc sử dụng các socket.broadcast.emit chi tiết Sơ đồ: -socket.broadcast.emit

Ở đây Mỗi Sockets đang nhận được thông báo ngoại trừ một tức là Initiator .

    // BY SOCKET>BROADCAST>EMIT
   socket.broadcast.emit('BroadCastExceptMe',{data:"HAVE A NICE DAY"});

Kết luận: - Bây giờ nó sẽ hoàn toàn phụ thuộc vào yêu cầu kinh doanh của chúng tôi mà cái nào sẽ thích hợp hơn.

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.