fs不会写入所有收到的数据文件

时间:2014-09-24 10:28:01

标签: node.js sockets filestream

我的node.js脚本:

var net = require('net');
var fs = require('fs');

var client = new net.Socket()

client.connect(PORT, HOST, function () {
       client.write('You can Send file\0');
       client.on('data', function (data) {
            // console.log(data); 
            var destinationFile = fs.createWriteStream("destination.txt");
            destinationFile.write(data);
       });  
 });

它被编码用于从远程HOST接收文件。 当我使用console.log(data)确定将远程数据文件记录到控制台时。 但是为了将数据写入文件,它写入接收数据文件的一部分。 如何将所有数据写入文件? 感谢

2 个答案:

答案 0 :(得分:3)

你得到的原因:

client.on('data')被多次调用,因为文件是以数据块的形式发送的,而不是作为单个整体data发送的。因此,在接收每个数据时,您将创建一个新的文件流并写入它...

另一方面,

Console.log有效,因为每次写入时都不会创建新的控制台窗口

快速解决方案是:

client.connect(PORT, HOST, function () {
       var destinationFile = fs.createWriteStream("destination.txt");
       client.write('You can Send file\0');
       client.on('data', function (data) {
            // console.log(data); 
            destinationFile.write(data);
       });  
 });

另请注意net.connect {{1}}方法{/ 3>}

  

通常不需要此方法,因为net.createConnection会打开   插座。仅在实现自定义套接字时使用此选项。

答案 1 :(得分:2)

您遇到的问题是因为您在事件中声明了文件流,每次数据包到达时都会调用该文件流。

client.connect(PORT, HOST, function () {
    var destinationFile = fs.createWriteStream("destination.txt"); //Should be here
    client.write('You can Send file\0');
    client.on('data', function (data) {
        destinationFile.write(data);
    });  
 });
  

感谢。在微小的测试中它可以。但是写入的文件比实际大小多16位。第一个文件有16位未知数据。怎么忽略那个?

在您的代码中,由于client.on被多次调用,因此多次写入会在同一时间发生,因此它是未定义的行为,对于该行为发生写入,按顺序或是否完成。

16字节的未知数据可能是来自不同数据包的字节,它们以随机顺序一个接一个地写入。您的小测试工作是因为文件可以在一个数据包中发送,因此该事件只被调用一次。

如果先声明文件流,则在client.on中调用write,保留写入和数据的顺序,并成功写入文件。