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

d11*_*wtq 14 node.js socket.io

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

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

对socket.io的广播文件(页面结束)说:

要广播,只需添加一个broadcast标志emitsend方法调用.广播意味着向除了启动它的套接字之外的所有人发送消息.

所以我目前捕获最新的客户端连接,变量,然后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 });
});
Run Code Online (Sandbox Code Playgroud)

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

use*_*594 19

为什么不在下面这样做?

io.sockets.emit('hello',{msg:'abc'});
Run Code Online (Sandbox Code Playgroud)

  • 嗯,好像我真的试过`io.sockets.broadcast.emit()`,我的坏,这似乎确实有用! (2认同)

ale*_*lex 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);
Run Code Online (Sandbox Code Playgroud)

注意:newFeed这只是一个事件示例,您可以拥有任意数量的事件.

重要

上面的解决方案也更好,因为将来您可能只需要向某些客户端发出某些消息,而不是所有客户端(因此需要条件).对于简单的东西(只发出一个消息给所有的客户无论是什么),io.sockets.broadcast.emit()是一个更适合确实如此.