【问题标题】:PubSub Server Example: How are messages broadcast?PubSub 服务器示例:消息如何广播?
【发布时间】:2014-05-19 01:27:41
【问题描述】:

我正在编写 Node.js in Action 一书,我对第 3 章中的 PubSub 服务器示例感到有些困惑。该示例允许用户通过 telnet 连接到服务器并相互广播消息。代码如下:

var events = require('events')
    , net = require('net');

var channel = new events.EventEmitter();
channel.clients = {};
channel.subscriptions = {};

channel.on('join', function(id, client) {
  this.clients[id] = client; 
  this.subscriptions[id] = function(senderId, message) {
    if (id != senderId) { 
      this.clients[id].write(message);
    }
  }
  this.on('broadcast', this.subscriptions[id]); 
});

channel.on('leave', function(id) { 
  channel.removeListener('broadcast', this.subscriptions[id]); 
  channel.emit('broadcast', id, id + " has left the chat.\n");
});

channel.on('shutdown', function() {
  channel.emit('broadcast', '', "Chat has shut down.\n");
  channel.removeAllListeners('broadcast');
});

var server = net.createServer(function (client) {
  var id = client.remoteAddress + ':' + client.remotePort;
  client.on('connect', function() {
    channel.emit('join', id, client); 
  });
  client.on('data', function(data) {
    data = data.toString();
    if (data == "shutdown\r\n") {
      channel.emit('shutdown');
    }
    channel.emit('broadcast', id, data); 
  });
  client.on('close', function() {
    channel.emit('leave', id); 
  });
});
server.listen(8888);

这似乎很明确。 client.on('data',function(data){... 显然是客户端提交消息的绑定,之后channel.emit... 负责广播但我无法弄清楚该消息是如何广播给所有其他用户的。对我来说,似乎必须遍历clients{} 中的所有客户端,但这不是代码处理它的方式。谁能向我解释channel.emit('broadcast'... 之后会发生什么,以便将数据广播给所有客户端?

【问题讨论】:

    标签: node.js publish-subscribe


    【解决方案1】:

    当客户端连接时,会发出“加入”。在“加入”事件处理程序中是this.on('broadcast', this.subscriptions[id]);。这会设置一个新的(附加的)“广播”事件处理程序,它将广播的任何内容写入新连接的客户端。因此,当客户端向服务器发送数据时,会发出“广播”,触发每个连接的客户端的“广播”事件处理程序,然后将广播的数据写入每个连接的客户端。

    【讨论】:

    • 好吧,这是有道理的。广播事件处理程序是内置的,所以只需为join 事件设置它就可以了?
    • 我不确定您所说的“内置”是什么意思,但会为每个新客户端创建/添加一个新的广播事件处理程序。这只需要完成一次,并且在“加入”时完成,因为每个新客户端只调用一次。
    • 我的困惑是事件处理程序似乎通常采用object.on('event', function(){...} 的形式,而这里它只是this.on('broadcast', this.subscriptions[id]); 的形式。我不确定行动发生在哪里。广播处理程序如何仅使用this.subscriptions[id] 将数据实际打印到频道?这是内置功能,因此不需要编码吗?
    • 存储为this.subscriptions[id] 的事件处理函数在上面设置为this.subscriptions[id] = function(senderId, message) {。它只是传入一个存储在变量中的函数,而不是将其作为匿名函数内联传递。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多