node.js + socket.io从服务器广播,而不是从特定的客户端?

我使用node.js + socket.io构build了一个简单的系统,如实时新闻提要。

由于这是一个“只读”系统,客户端连接和接收数据,但客户端从来没有真正发送任何自己的数据。 服务器生成需要发送给所有客户端的消息,没有客户端产生任何消息; 但我确实需要播放。

socket.io的广播文档 (页面结尾)说

要进行广播,只需添加一个broadcast标志来sendsend方法调用。 广播意味着将消息发送给除了启动它的套接字以外的其他人。

所以我目前捕获最新的客户端连接到一个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()确实更合适