('connect')错误的NodeJS事件
最近我开始用“Node.js in Action”一书来学习Node.js。 在这一章中有以下列表:
var events = require('events'); var net = require('net'); var channel = new events.EventEmitter(); channel.clients = {}; channel.subsriptions = {}; channel.on('join', function (id, client) { this.clients[id] = client; this.subsriptions[id] = function (senderId, message) { if (id !== senderId) { this.clients[id].write(message); } }; this.on('broadcast', this.subsriptions[id]); }); 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(); channel.emit('broadcast', id, data); }); }); server.listen(8888);
我跑了代码:
node chat_server.js
然后打开新的terminal并连接到chat_sever:
telnet 127.0.0.1 8888
然后再次打开新的terminal窗口并连接到chat_server。 这本书说:
“如果你打开几条命令行,你会发现任何input到一个命令行的东西都会被回显给其他人。”
我尝试input一个terminal,但没有任何回音。 有什么可以成为问题? 我正在运行Ubuntu 12.04
编辑:
我试图debugging这个部分:
client.on('connect', function () { console.log('joined ' + id); channel.emit('join', id, client); });
但即使打开了几个terminal,也不显示“join消息”。
我通过这个SO问题的帮助解决了我的问题:
在服务器端,当你得到callback的时候,套接字已经被连接,而你试图收听的事件不会在已经连接的套接字上发出。
所以,我在client.on('connect')之外发出'join'。 换句话说这个代码:
client.on('connect', function () { channel.emit('join', id, client); });
什么也没做。 它必须被replace为:
channel.emit('join', id, client);