【问题标题】:NodeJs TCP client bufferSize to call multiple `data` event?NodeJs TCP客户端bufferSize调用多个“数据”事件?
【发布时间】:2013-10-16 06:21:04
【问题描述】:

我刚刚注意到 NodeJs TCP 客户端中有一个bufferSize,您可以将传入缓冲区限制为 TCP 客户端。

所以我的问题是,如果我将客户端的 bufferSize 设置为 1 个字节并从服务器发送 16 个字节,我是否应该在客户端获得 16 个不同的 data 事件?

【问题讨论】:

    标签: node.js tcp


    【解决方案1】:

    您所指的bufferSize可写 流的read-only property

    Object.defineProperty(Socket.prototype, 'bufferSize', {
      get: function() {
        if (this._handle) {
          return this._handle.writeQueueSize + this._writableState.length;
        }
      }
    });
    

    (如果您在谈论其他内容,请纠正我)

    如果你想控制你的客户端如何接收数据,你应该在non-flowing mode中设置你的流:

    readable.on('readable', function() {
      var chunk;
      while (null !== (chunk = readable.read())) {
        console.log('got %d bytes of data', chunk.length);
      }
    });
    

    (see doc)

    如果您只想读取 5 个字节,可以传递 readable.read(5)。默认情况下,流将处于非流动模式,除非您附加 'data' 事件(因此在您的情况下不要这样做)。

    【讨论】:

    • 感谢您的链接,我想我对 bufferSize 的看法有误。所以我只是有一个小问题,在非流动模式下如果我调用stream.read()方法,我应该收到多少数据?
    • stream.read() 将返回当前可用的任何数据。如果您传递一个 int,它只会返回 X 个字节,因此您可以轻松解析数据。如果现在数据可用,您必须等待下一个readable 事件。我已经用部分 node.js 流文档编辑了我的答案。
    • 非常感谢您的回复 Laurent。我仍然对 TCP 数据包有一些问题,例如,是否可以同时从服务器获取两个 TCP 数据包?但我想我应该在不同的线程中问它,但如果你有任何关于它的资源/文章,它应该可以帮助我理解发生了什么:)
    • 当一个 TCP 数据包到达时,它进入套接字缓冲区并触发一个readable 事件。然后,您可以调用read() 来获取所有可用数据或调用read(x) 来获取前x 个字节。但是,node.js 不保证您会一个一个地收到数据包(如果事件循环没有足够快地触发您的回调,您可能会同时收到 2 个数据包)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多