繁体   English   中英

在node.js中使用tcp发送大文件但接收到损坏的文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM