我正在使用node.js + socket.io构建一个像实时新闻源这样的简单系统。
由于这是一个“只读”系统,客户端连接和接收数据,但客户端实际上从不发送任何自己的数据。服务器生成需要发送给所有客户端的消息,没有客户端生成任何消息;但我确实需要播出。
documentation for socket.io's broadcast(页面末尾)说
要进行广播,只需向
broadcast
和emit
方法调用添加send
标记即可。广播意味着向除了启动它的套接字以外的所有人发送消息。
所以我当前捕获最新的客户端连接到一个变量,然后emit()
到该套接字和 broadcast.emit()
到该套接字,这样这个新的客户端得到所有其他客户端的新数据和。但感觉客户端的角色只不过是我认为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 });
});
基本上导致数据需要发送到客户端的事件都是服务器端,而不是客户端。
答案 0 :(得分:17)
为什么不在下面这样做?
io.sockets.emit('hello',{msg:'abc'});
答案 1 :(得分:5)
由于您只在服务器端发出事件,因此您应该为服务器创建自定义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
只是一个事件示例,您可以拥有任意数量的事件。
重要强>
上述解决方案也更好,因为将来您可能只需要向某些客户端发出某些消息,而不是所有客户端(因此需要条件)。对于更简单的事情(只是向所有客户发送消息,无论如何),io.sockets.broadcast.emit()
确实是更合适。