【发布时间】:2014-01-02 19:52:32
【问题描述】:
NodeJS 中的 net.Socket 对象是可读流,但文档中的一条注释让我担心:
对于Net.Socket 'data' 事件,docs say
请注意,当
Socket发出'data'事件时,如果没有侦听器,数据将会丢失。
这似乎意味着一个 Socket 以“流动模式”返回给调用脚本并且已经取消暂停?但是,对于通用的可读流,'data' 事件的 documentation 表示
如果您附加一个
data事件侦听器,那么它将把流切换到流动模式,并且一旦数据可用,就会将数据传递给您的处理程序。
“如果”似乎暗示如果您稍等片刻才能绑定到'data' 事件,则流将等待您,如果您有意错过'data' 事件,则example 在resume() 方法似乎表明您必须调用resume() 方法来启动数据流。
我担心的是,在使用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);
任何人都有侦听原始套接字流以了解此数据丢失是否是问题的经验?
我希望这是 Net.Socket 文档自 v0.10 以来未更新的实例,因为 stream documentation 有一个部分提到 'data' 事件在 0.10 之前的版本中立即开始发出。是否已正确更新 TCP 套接字以不立即开始发送 'data' 数据包,并且文档未适当更新?
【问题讨论】:
标签: node.js