我的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)
确定将远程数据文件记录到控制台时。
但是为了将数据写入文件,它写入接收数据文件的一部分。
如何将所有数据写入文件?
感谢
答案 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,保留写入和数据的顺序,并成功写入文件。