关于net模块使用
《Nodejs实战》这本书,现在我看到第三章,前面总体的不错。 第三章中有段代码,纠结了一会,是关于net的,如下 粗框里的这句是否已经算是connection事件了,然后下面细框中的又来了一个connect事件? 疑惑不觉,自己敲了一遍,发现确有问题,按照书上的代码根本无法触发connection事件了,去掉细框中的代码可以正常触发。 自己改了一下,如下 不知道书上写得正确与否?还是我自己错了~
7 回复
net.createServer
带两个参数,options
和connectionListener
,两个都是可选的。而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 嗯 一切都以源代码为准,毕竟跑在机器上的不是咱俩的评论和帖子