关于net.createServer()的一点疑问
发布于 10 年前 作者 xzedx 5579 次浏览 最后一次编辑是 8 年前 来自 问答

代码:

var events = require('events');
var 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]);
});

var server = net.createServer(function(client){   //here
  var id = client.remoteAddress + ":" + client.remotePort;
  client.on('connect', function(){	//事件1 <<问题行
    channel.emit('join', id, client); 
  });
  client.on('data', function(data){	//事件2
    data = data.toString();
    channel.emit('broadcast', id, data);
  });
});

server.listen(8888);

最近在看Node.js in action一书,里面有个例子是建一个简单的聊天服务器 但是我运行代码后发现有问题,不知道怎么解决,看文档也找不到详细解释,所以到这里请教。 createServer的回调函数里面给新建的链接添加了个connect事件(见上面的问题行),但是我尝试用telnet连接的时候发现connect事件无法被触发,而data事件却可以触发,表明已经连接成功了,这让我很郁闷,所以想请教下这个connect事件的一些细节。

万分感谢。

5 回复

服务器只会触发 connection 事件,亦即是调用 createServer 中的回调函数。 connect 是客户端调用 connect() 函数成功连接后才会触发的 你再看看文档中的上述两个事件和两个函数

据我所知 你说的这个net.Socket对象的connect事件应该是你开发tcp的客户端时,连接到服务器时(通过socket.connect()方法),才会触发你说的connect事件。 你是在开发服务器,不是客户端。

@gvforjob 原来如此,我改成server.on(‘connection’)成功了,谢谢!

@nodejser 明白了,刚刚也发现了这个问题。我是参考书上源码的,没想到错的这么离谱。。

@nodejser@gvforjob @xzedx ,谢谢大家,解决了我的疑问,看来书上错误很多啊

回到顶部