gpt4 book ai didi

node.js - 在 Nodejs 中从套接字接收大量二进制数据

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

我想从 tcp 套接字接收二进制数据(如 .pdf 或 .doc),代码如下:

发送文件:

fs.readFile(path, function (err, data) {
var client = new net.Socket();
client.connect(user_port, user_ip, function () {
client.write(data, 'binary');
client.destroy();
});
});

接收文件:

net.createServer(function(socket){
socket.setEncoding('binary');
socket.on('data', function (data) {
var file_data = new Buffer(data, 'binary');
fs.appendFile(utils.getUserDir() + '/my_file.doc', file_data);
});
socket.on('error', function(err){
console.log(err.message);
})
}).listen(utils.getPort(), utils.getExternalIp());

由于文件对于只有一个 tcp 套接字来说太大了,它们与多个数据包一起发送,实际上同一个文件有多个“数据”事件。我认为可以将每个 Buffer() 数据附加到一个文件中,但是当我打开 .doc 时,他已损坏或其中包含二进制文件。

PS:我不能使用 Buffer().concat 并在之后保存文件,因为我不知道哪个数据包是最后一个......

谢谢

最佳答案

对于像这样发送文件,最好将它们流式传输而不是将它们全部缓冲到内存中然后发送。 (此外,您不需要 'binary' 编码参数,因为 fs.readFile() 默认为您提供一个 Buffer)

例如:

var client = new net.Socket();
client.connect(user_port, user_ip, function() {
fs.createReadStream(path).pipe(client);
});

// ...

net.createServer(function(socket){
socket.pipe(fs.createWriteStream(utils.getUserDir() + '/my_file.doc'));
socket.on('error', function(err){
console.log(err.message);
});
}).listen(utils.getPort(), utils.getExternalIp());

关于node.js - 在 Nodejs 中从套接字接收大量二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36211148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com