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

node.js+;socket.io从服务器而不是从特定客户端广播?,node.js,socket.io,Node.js,Socket.io,我正在使用node.js+socket.io构建一个简单的系统,比如实时新闻提要 由于这是一个“只读”系统,客户机连接并接收数据,但客户机从未实际发送自己的任何数据。服务器生成需要发送给所有客户端的消息,没有客户端生成任何消息;但我确实需要广播 (页末)写着 要进行广播,只需将broadcast标志添加到emit和send方法调用。广播意味着向除启动它的套接字之外的所有人发送消息 因此,我当前捕获了最新的客户端,将其连接到一个变量中,然后将emit()连接到该套接字,并将broadcast.em

我正在使用node.js+socket.io构建一个简单的系统,比如实时新闻提要

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

(页末)写着

要进行广播,只需将
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 });
});

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

因为您只在服务器端发送事件,所以应该为服务器创建自定义事件

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

为什么不像下面这样做呢

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

啊,我以前也做过类似的事情,虽然更多的是传统的观察者设计模式(这是我第一天使用node),但我担心循环效率低下。新消息每7秒向大约10000个客户端广播一次。我假设广播使用了一种有效的算法,但可能只是一种抽象。我试试你的方法;)有点离题了,但我需要处理断开连接,还是socket.io/node会帮我处理它?似乎我最终会使用死掉的事件观察器。您不需要处理断开连接。当我尝试时,我得到一个错误,即
io.sockets.emit
不是一个定义的函数。嗯,似乎我实际上尝试了
io.sockets.broadcast.emit()
,我的错,这似乎确实有效!我将更改所选答案,因为这要简单得多,谢谢。如果您有一些简单的方法确实可以使用,如果您需要迭代套接字并仅在满足特定条件时发送消息,那么我的解决方案更通用。从v1.0.4开始,我可以简单地编写
io.emit('hello',{msg:'abc'))
而且它也能正常工作。