node.js + socket.io从服务器广播,而不是从特定的客户端?
我使用node.js + socket.io构build了一个简单的系统,如实时新闻提要。
由于这是一个“只读”系统,客户端连接和接收数据,但客户端从来没有真正发送任何自己的数据。 服务器生成需要发送给所有客户端的消息,没有客户端产生任何消息; 但我确实需要播放。
socket.io的广播文档 (页面结尾)说
要进行广播,只需添加一个
broadcast
标志来send
和send
方法调用。 广播意味着将消息发送给除了启动它的套接字以外的其他人。
所以我目前捕获最新的客户端连接到一个variables,然后发送emit()
到该套接字和 broadcast.emit()
到该套接字,这样这个新的客户端获取新的数据和所有其他客户端。 但是感觉客户端的angular色只不过是我认为socket.io已经支持的解决方法。
有没有办法根据服务器发起的事件向所有客户端发送数据?
我目前的做法大致是:
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 }); });
基本上,导致数据需要发送到客户端的事件都是服务器端,而不是客户端。
为什么不就像下面这样做?
io.sockets.emit('hello',{msg:'abc'});
由于您仅在服务器端发布事件,因此应该为您的服务器创build一个自定义EventEmitter 。
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);
注意: newFeed
只是一个事件的例子,你可以有任意多的事件。
重要
上面的解决scheme比较好,因为将来你可能需要发送一些消息给一些客户,而不是全部(因此需要条件)。 对于更简单的事情(不pipe发生什么事情都要发送消息给所有的客户端), io.sockets.broadcast.emit()
确实更合适 。