【问题标题】:NodeJS sockets initialized as unpaused?NodeJS套接字初始化为未暂停?
【发布时间】:2014-01-02 19:52:32
【问题描述】:

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

对于Net.Socket 'data' 事件,docs say

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

这似乎意味着一个 Socket 以“流动模式”返回给调用脚本并且已经取消暂停?但是,对于通用的可读流,'data' 事件的 documentation 表示

如果您附加一个data 事件侦听器,那么它将把流切换到流动模式,并且一旦数据可用,就会将数据传递给您的处理程序。

“如果”似乎暗示如果您稍等片刻才能绑定到'data' 事件,则流将等待您,如果您有意错过'data' 事件,则exampleresume() 方法似乎表明您必须调用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


    【解决方案1】:

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

    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()socket,你会丢失它。

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

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2020-05-24
      • 2013-10-04
      • 2018-11-20
      • 2023-03-29
      • 2012-01-14
      • 1970-01-01
      • 2016-01-27
      相关资源
      最近更新 更多