gpt4 book ai didi

sockets - NodeJS : What is the proper way to handling TCP socket streams ? 我应该使用哪个定界符?

转载 作者:可可西里 更新时间:2023-11-01 02:31:36 25 4
gpt4 key购买 nike

据我了解here ,“V8 有一个分代垃圾收集器。随机移动对象。 Node 无法获取指向原始字符串数据的指针以写入套接字。”所以我不应该将来自 TCP 流的数据存储在字符串中,特别是当该字符串变得大于 Math.pow(2,16) 字节时。 (希望我到现在为止都是对的..)

那么处理来自 TCP 套接字的所有数据的最佳方法是什么?到目前为止,我一直在尝试使用 _:_:_ 作为分隔符,因为我认为它在某种程度上是独一无二的,不会混淆其他东西。

数据样本将是一些东西_:_:_可能是一个大文本_:_:_可能是成吨的行_:_:_越来越多的数据

这是我尝试做的:

net = require('net');
var server = net.createServer(function (socket) {
socket.on('connect',function() {
console.log('someone connected');
buf = new Buffer(Math.pow(2,16)); //new buffer with size 2^16
socket.on('data',function(data) {
if (data.toString().search('_:_:_') === -1) { // If there's no separator in the data that just arrived...
buf.write(data.toString()); // ... write it on the buffer. it's part of another message that will come.
} else { // if there is a separator in the data that arrived
parts = data.toString().split('_:_:_'); // the first part is the end of a previous message, the last part is the start of a message to be completed in the future. Parts between separators are independent messages
if (parts.length == 2) {
msg = buf.toString('utf-8',0,4) + parts[0];
console.log('MSG: '+ msg);
buf = (new Buffer(Math.pow(2,16))).write(parts[1]);
} else {
msg = buf.toString() + parts[0];
for (var i = 1; i <= parts.length -1; i++) {
if (i !== parts.length-1) {
msg = parts[i];
console.log('MSG: '+msg);
} else {
buf.write(parts[i]);
}
}
}
}
});
});
});

server.listen(9999);

每当我尝试 console.log('MSG' + msg) 时,它都会打印出整个缓冲区,因此查看是否有效是没有用的。

如何正确处理这些数据?惰性模块会工作吗,即使这个数据不是面向行的?是否有一些其他模块来处理非面向行的流?

最佳答案

确实有人说还有额外的工作正在进行,因为 Node 必须获取该缓冲区,然后将其插入 v8/将其转换为字符串。但是,在缓冲区上执行 toString() 也好不到哪儿去。据我所知,目前还没有好的解决方案,特别是如果您的最终目标是获得一个字符串并随意使用它。这是 Ryan 提到的 @nodeconf 中需要完成的工作之一。

至于分隔符,你可以选择任何你想要的。许多二进制协议(protocol)选择包含一个固定的 header ,这样你就可以把东西放在一个正常的结构中,很多时候它包括一个长度。通过这种方式,您可以将已知的 header 切开并获取有关其余数据的信息,而无需遍历整个缓冲区。使用这样的方案,可以使用如下工具:

顺便说一句,可以通过数组语法访问缓冲区,也可以使用 .slice() 将它们切开。

最后,在这里查看:https://github.com/joyent/node/wiki/modules -- 找到一个解析简单的 tcp 协议(protocol)并且似乎做得很好的模块,并阅读一些代码。

关于sockets - NodeJS : What is the proper way to handling TCP socket streams ? 我应该使用哪个定界符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7034537/

25 4 0