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

我的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)它确定以远程数据文件logging到控制台。 而是写入数据以将其写入接收到的数据文件的一部分。 如何将所有数据写入文件? 谢谢

       

网上收集的解决方案 "fs不写入所有收到的数据文件"

你得到的原因:

client.on('data')被多次调用,因为文件是以数据块的forms发送的,而不是作为一个整体的data 。 作为接收每个数据的结果,你创build一个新的文件stream并写入它。

Console.log另一方面,因为它不会创build新的控制台窗口,每次你写它。

快速解决scheme将是:

 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中的net文件方法:

通常这种方法是不需要的,因为net.createConnection打开套接字。 只有在您实现自定义套接字时才使用此function。

你得到的问题是因为你声明了事件内部的文件stream,每当数据包到达时被调用。

 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); }); }); 

谢谢。 在微小的testing中就可以了。 但写入的文件比实际大小多16位。 第一个文件有16位未知数据。 如何忽略这个?

在你的代码中,因为client.on是多次调用的,所以多次写入发生在同一时间,所以写入发生的行为是不确定的,按什么顺序,或者是否完成。

未知数据的16字节可能是来自不同数据包的随机顺序写入的字节。 你的小testing工作,因为文件可以发送在一个数据包,所以事件只被调用一次。

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