2011-12-21 34 views
12

Tôi đang xây dựng một hệ thống đơn giản như nguồn cấp dữ liệu tin tức thời gian thực, sử dụng node.js + socket.io.phát sóng node.js + socket.io từ máy chủ, thay vì từ một khách hàng cụ thể?

Vì đây là hệ thống "chỉ đọc", khách hàng kết nối và nhận dữ liệu, nhưng khách hàng không bao giờ thực sự gửi bất kỳ dữ liệu nào của riêng họ. Máy chủ tạo ra các tin nhắn cần được gửi đến tất cả các máy khách, không có máy khách nào tạo ra bất kỳ thông báo nào; nhưng tôi cần phải phát sóng.

Các documentation for socket.io's broadcast (cuối trang) nói

Để phát sóng, chỉ cần thêm một lá cờ broadcast-emitsend lời gọi phương thức. Phát sóng có nghĩa là gửi một tin nhắn đến tất cả mọi người trừ khi ổ cắm khởi động nó.

Vì vậy, tôi đang nắm bắt được khách hàng gần đây nhất để kết nối, vào một biến, sau đó emit() để ổ cắm mà broadcast.emit() để ổ cắm đó, chẳng hạn mà khách hàng mới này được các dữ liệu mới tất cả các khách hàng khác . Nhưng nó cảm thấy như vai trò của khách hàng ở đây là không có gì hơn là một workaround cho những gì tôi nghĩ socket.io đã được hỗ trợ.

Có cách nào để gửi dữ liệu đến tất cả khách hàng dựa trên sự kiện do máy chủ khởi xướng không?

cách tiếp cận hiện tại của tôi là khoảng:

var socket; 

io.sockets.on("connection", function (s) { 
    socket = s; 
}); 

/* bunch of real logic, yadda yadda ... */ 

myServerSideNewsFeed.onNewEntry(function (msg) { 
    socket.emit("msg", { "msg" : msg }); 
    socket.broadcast.emit("msg", { "msg" : msg }); 
}); 

Về cơ bản các sự kiện làm cho dữ liệu cần gửi cho khách hàng là tất cả các server-side, không client-side.

Trả lời

16

Tại sao không chỉ làm như dưới đây?

io.sockets.emit('hello',{msg:'abc'}); 
+0

Khi tôi thử rằng tôi đã nhận được lỗi rằng 'io.sockets.emit' không phải là một hàm được xác định. – d11wtq

+0

Nó hoạt động cho tôi: P, phiên bản nào của socket io bạn đang sử dụng – user482594

+2

Hmm, có vẻ như tôi đã thực sự thử 'io.sockets.broadcast.emit()', xấu của tôi, điều này dường như hoạt động! – d11wtq

4

Vì bạn chỉ phát ra sự kiện ở phía máy chủ, bạn nên tạo một tùy chỉnh EventEmitter cho máy chủ của mình.

var io = require('socket.io').listen(80); 
    events = require('events'), 
    serverEmitter = new events.EventEmitter(); 

io.sockets.on('connection', function (socket) { 
    // here you handle what happens on the 'newFeed' event 
    // which will be triggered by the server later on 
    serverEmitter.on('newFeed', function (data) { 
    // this message will be sent to all connected users 
    socket.emit(data); 
    }); 
}); 

// sometime in the future the server will emit one or more newFeed events 
serverEmitter.emit('newFeed', data); 

Lưu ý: newFeed chỉ là một ví dụ sự kiện, bạn có thể có bao nhiêu sự kiện tùy thích.

quan trọng

Các giải pháp trên là cũng tốt hơn bởi vì trong tương lai bạn có thể cần phải phát ra thông điệp nhất định đối với một số khách hàng, không phải tất cả (do đó cần điều kiện). Đối với một cái gì đó đơn giản hơn (chỉ phát ra một tin nhắn cho tất cả các khách hàng không có vấn đề gì), io.sockets.broadcast.emit()phù hợp hơn với thực tế.

+0

Ah, tôi đã làm điều gì đó rất giống nhau trước đây, mặc dù với nhiều mẫu thiết kế quan sát thông thường hơn (đây là ngày đầu tiên sử dụng nút), nhưng tôi lo ngại rằng vòng lặp không hiệu quả. Tin nhắn mới được phát cứ sau 7 giây đến khoảng 10.000 khách hàng. – d11wtq

+0

Tôi giả sử phát sóng được sử dụng một thuật toán hiệu quả, nhưng có lẽ nó chỉ là một trừu tượng. Tôi sẽ cố gắng tiếp cận của bạn;) – d11wtq

+0

Một chút off-topic, nhưng tôi cần phải xử lý ngắt kết nối, hoặc sẽ socket.io/node chăm sóc nó cho tôi? Có vẻ như tôi sẽ kết thúc với những người quan sát sự kiện đã chết. – d11wtq

Các vấn đề liên quan