我正在研究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'...
之后会发生什么,以便将数据广播给所有客户?
答案 0 :(得分:1)
当客户端连接时,会发出'join'。在'join'事件处理程序中是this.on('broadcast', this.subscriptions[id]);
。这将设置一个新的(附加)“广播”事件处理程序,它将广播的内容写入新连接的客户端。因此,当客户端向服务器发送数据时,会发出“广播”,触发连接的每个客户端的“广播”事件处理程序,然后将该广播数据写入每个连接的客户端。