我在Node.js上有服务器端的基于TCP的客户端/服务器应用程序。由于TCP是一个流,我需要单独的数据包,所以我会在每个数据包之前发送两个字节的长度(我猜是常见做法)。大数据包可能会进入少量块(因为MTU和其他东西),因此我需要从当前缓冲区中提取每个数据包,然后将剩下的数据包与下一个传入块进行连接并再次解析。我想出了下面的代码:切片缓冲区的垃圾回收
function parsePackets(data) {
// join existing buffer contents with new chunk
var buffer = Buffer.concat([this.buffer, data]);
var start = 0;
var end = buffer.length;
var packets = [];
while (true) {
// wait for at least two bytes
if (end - start < 2) {
break;
}
var length = buffer.readUInt16BE(start);
// wait until we can read whole packet
if (end - start < length) {
break;
}
// push packet data as a separate packet
//var data = new Buffer(length);
//buffer.copy(data, 0, start, start + length);
var data = buffer.slice(start, start + length);
packets.push(data);
start += length;
}
// drop parsed buffer contents, leaving the rest
//var newBuffer = new Buffer(buffer.length - start);
//buffer.copy(newBuffer, 0, start, buffer.length);
//this.buffer = newBuffer;
this.buffer = buffer.slice(start, buffer.length);
return packets;
}
我关心的是:将切掉缓冲区的内容被垃圾收集?我也在做concat
返回新的缓冲区(我假设从提供的缓冲区复制内容,这意味着它们可以被垃圾收集)。或者,也许我需要使用copy
而不是slice
(我在注释行中有一个示例)?
我想没有内存泄漏高性能的代码,所以我不想比我要更复制数据。但目前看起来我的应用程序的内存使用量变得越来越大(我不知道如何测试它,以及如何检查切掉的内容是否会被释放)。
>完成读取所有数据。你什么意思?只要客户端连接,总是有数据需要读取。当客户端将断开这个。缓冲区将随着这个被破坏。 – bobby
@bobby - 好的,那么这个部分很好。你没有展示整个对象的生命周期是如何管理的,所以我无法知道它是如何被使用的。 – jfriend00