[英]sending large files using tcp in node.js but receiving corrupt file
我正在尝试使用node.js编写自己的文件共享器应用程序。 我写了发送者代码和接收者代码。 发送文本文件时,一切正常,但尝试发送.jpg或.mp3之类的文件时,失败。 问题是在接收端,文件被接收为“损坏”。 以下是我的发送者代码和接收者代码
发件人:
const net = require('net'); const fs = require('fs'); var destAddr = process.argv[2], destPort = process.argv[3], sourceFile = process.argv[4]; const client = net.connect(destPort, destAddr, function() { /*fs.readFile(sourceFile,function(err,data){ if(data) { if(client.write(data)==true) { console.log("Data [ size: %d ] written succesfully",data.length); client.destroy(); } else console.log("Data write failure"); } else client.write("err"); }); */ var fileStream = fs.createReadStream(sourceFile); fileStream.on('error', function(err) { console.log(err); }); fileStream.on('open', function() { fileStream.pipe(client); }); });
接收方:
const net = require('net'); const fs = require('fs'); var fileName = 'receivedfile.' + process.argv[2]; // process.argv[2] is the file extension to be used to write the file to disk at the receiving end; const options = { allowHalfOpen: false, pauseOnConnect: false, }; var fileCount = 0; const server = net.createServer(options, function(listener) { listener.on('data', (data) => { console.log("Data [ size: %d ] received", data.length); fs.writeFile(fileName, data, function(err) { if (err) console.log("Error writing file to disk"); else { console.log("Write successful"); fileCount++; console.log("[ Files received =] %d", fileCount); console.log("Press Ctr+c to exit"); } }); }); }).listen(8001, () => { console.log("Client is waiting for the file on port 8001"); });
我要去哪里错了?
在连接的生存期内, data
事件可以使用各种大小的数据块多次触发。
相反,使用流可能会更容易:
const server = net.createServer(listener => {
let stream = fs.createWriteStream(fileName);
listener.on('error', err => console.log('socket error', err));
stream .on('error', err => console.log('file error', err));
listener.pipe(stream).on('finish', () => {
console.log("Write successful");
fileCount++;
console.log("[ Files received =] %d", fileCount);
console.log("Press Ctr+c to exit");
})
}).listen(...);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.