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

时间:2011-12-21 11:12:40

标签: node.js socket.io

我正在使用node.js + socket.io构建一个像实时新闻源这样的简单系统。

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

documentation for socket.io's broadcast(页面末尾)说

  

要进行广播,只需向broadcastemit方法调用添加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 });
});

基本上导致数据需要发送到客户端的事件都是服务器端,而不是客户端。

2 个答案:

答案 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()确实是更合适