关于net模块使用
发布于 10 年前 作者 hoozi 5160 次浏览 最后一次编辑是 8 年前 来自 问答

《Nodejs实战》这本书,现在我看到第三章,前面总体的不错。 第三章中有段代码,纠结了一会,是关于net的,如下 QQ截图20140917160735.jpg 粗框里的这句是否已经算是connection事件了,然后下面细框中的又来了一个connect事件? 疑惑不觉,自己敲了一遍,发现确有问题,按照书上的代码根本无法触发connection事件了,去掉细框中的代码可以正常触发。 自己改了一下,如下 QQ截图20140917160510.jpg 不知道书上写得正确与否?还是我自己错了~

7 回复

net.createServer带两个参数,optionsconnectionListener,两个都是可选的。而connectionListener是作为connection事件的监听器。

图1中,你怎么知道没有触发connection事件?只是没有触发connect而已。估计书上的是老版本写法。

@HQidea 嗯已经想到可能是版本问题,感觉node以及一些模块更新好快,刚写的socketio,新版的就出来了…

新版本也有:

  • server.on(‘connection’, onconnection) 对应的是uv里面 uv_listen函数的第二个参数,是在uv层回调的,是在syscall(accept4)之后执行
  • client.on(‘connect’, onconnect)是在server端内部还有一个私有的onconnection函数,里面是client = new Socket(…),所以里面的connect事件是由nodejs触发的。

@yorkie 但是我这个内部的client.on(‘connect’, onconnect) 不执行?

  • client的connect只有调用了Socket.prototype.connect方法后才执行(所以事件的名字才是connect),你可以顺着这个看:https://github.com/joyent/node/blob/master/lib/net.js#L837
  • 再看onconnection:https://github.com/joyent/node/blob/master/lib/net.js#L1272-L1301 ,在1288行直接new Socket了一个连接,但是这里只是把这个连接的句柄(fd)直接传给Socket用,所以后面没有调用connect(因为已经有句柄了嘛),最后在1300行(函数最后)直接把new的socket传出去给connection了。
  • 我木有说上面例子是对的,只是强调socket是有connect事件还有server的connection具体什么时候调用

@yorkie node 水很深啊,看完net源码,瞬间恍然大悟

@hoozi 嗯 一切都以源代码为准,毕竟跑在机器上的不是咱俩的评论和帖子

回到顶部