【发布时间】:2013-10-16 06:21:04
【问题描述】:
我刚刚注意到 NodeJs TCP 客户端中有一个bufferSize,您可以将传入缓冲区限制为 TCP 客户端。
所以我的问题是,如果我将客户端的 bufferSize 设置为 1 个字节并从服务器发送 16 个字节,我是否应该在客户端获得 16 个不同的 data 事件?
【问题讨论】:
我刚刚注意到 NodeJs TCP 客户端中有一个bufferSize,您可以将传入缓冲区限制为 TCP 客户端。
所以我的问题是,如果我将客户端的 bufferSize 设置为 1 个字节并从服务器发送 16 个字节,我是否应该在客户端获得 16 个不同的 data 事件?
【问题讨论】:
您所指的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()方法,我应该收到多少数据?
readable 事件。我已经用部分 node.js 流文档编辑了我的答案。
readable 事件。然后,您可以调用read() 来获取所有可用数据或调用read(x) 来获取前x 个字节。但是,node.js 不保证您会一个一个地收到数据包(如果事件循环没有足够快地触发您的回调,您可能会同时收到 2 个数据包)。