NodeJS套接字初始化为未暂停?

NodeJS中的net.Socket对象是一个可读stream,但文档中的一个注释让我担心:

对于Net.Socket 'data'事件, 文档说

请注意,如果Socket发出'data'事件时没有侦听器, 数据将会丢失

这似乎意味着一个Socket以“stream动模式”返回到调用脚本并且已经暂停? 但是,对于通用可读stream, 'data'事件的文档说

如果你附加一个data事件监听器,那么它将把stream切换到stream模式,数据将尽快传递给你的处理程序。

这个“If”似乎意味着如果你等待一下绑定到'data'事件,stream将等待你,如果你故意想错过'data'事件,在resume()方法的例子似乎以表示您必须调用resume()方法来启动数据stream。

我担心的是,在使用net.Server ,当您收到一个net.Socket作为'connection'事件的一部分时,是否必须立即开始处理'data ”事件,因为它已经打开? 意思是如果我这样做:

 var s = new net.Server(); s.on('connection', function(socket) { // Do some lengthy setup process here, blocking execution for a few seconds... socket.on('data', function(d) { console.log(d); }); }); s.listen(8080); 

意思是不能立即绑定到'data'事件,我可能会丢失数据? 那么这是一个更强大的方式来处理传入的连接,如果你有一个冗长的设置每个需要?

 var s = new net.Server(); s.on('connection', function(socket) { socket.pause(); // Not ready for you yet! // Do some lengthy setup process here, blocking execution for a few seconds... socket.on('data', function(d) { console.log(d); }); socket.resume(); // Okay, go! }); s.listen(8080); 

任何人都有经验,在原始套接字stream上进行侦听,以了解这种数据丢失是否是一个问题?

我希望这是一个Net.Socket文档自v0.10以来没有更新的实例,因为stream文档中提到了0.10版之前版本的'data'事件。 是否正确更新了TCP套接字,不立即开始发射'data'数据包,文档没有正确更新?

是的,这是文档缺陷。 这里是一个例子:

 var net = require('net') var server = net.createServer(onConnection) function onConnection (socket) { console.log('onConnection') setTimeout(startReading, 1000) function startReading () { socket.on('data', read) socket.on('end', stopReading) } function stopReading () { socket.removeListener('data', read) socket.removeListener('end', stopReading) } } function read (data) { console.log('Received: ' + data.toString('utf8')) } server.listen(1234, onListening) function onListening () { console.log('onListening') net.connect(1234, onConnect) } function onConnect () { console.log('onConnect') this.write('1') this.write('2') this.write('3') this.write('4') this.write('5') this.write('6') } 

所有的数据都收到了。 如果你明确地resume()套接字,你将失去它。

另外,如果你以阻塞的方式进行“冗长”的设置(你不应该这样做),你不能丢失任何IO,因为它没有机会被处理,所以不会发生事件。