2014-09-24 50 views
1

我的node.js腳本:fs也不寫所有接收到的數據文件

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

它被編碼爲從遠程主機接收的文件。 當我使用console.log(data)其確定將遠程數據文件記錄到控制檯。但是用於寫入數據以將其寫入接收到的數據文件的一部分。 如何將所有數據寫入文件? 感謝

+1

我會嘗試的第一件事就是在'client.on'事件之外創建文件流,你可能會以某種方式重疊。 – DrakaSAN 2014-09-24 10:30:43

+0

謝謝。在微小的測試中就可以了。但書面文件比實際大小多16位。第一個文件有16位未知數據。如何忽略這一點? – hahamed 2014-09-24 11:00:07

回答

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 Documentation還要注意對net.connect方法:

通常不需要此方法,因爲net.createConnection打開 插座。僅當您正在實施自定義套接字時才使用此功能。

+0

+1,因爲它是很好的答案,但它像評論偷獵一樣敏感。 – DrakaSAN 2014-09-24 14:19:21

+0

@DrakaSAN沒有進攻節點兄弟。我看到你的評論,這是正確的,有一些猜測,但是正確的。我假設你留下了這個問題,因爲之後沒有答案,所以我總結了它的完整性。 +1給你也是:D – alandarev 2014-09-24 15:17:32

+0

@alandrarev:我剛去吃飯,但是謝謝:) – DrakaSAN 2014-09-24 15:19:14

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中的寫入,則會保留寫入和數據的順序,並且成功寫入文件。

+0

如何忽略代碼中的第一個16位接收數據? – hahamed 2014-09-27 05:23:24

+0

你仍然得到固定代碼的16個字節的未知數據? – DrakaSAN 2014-09-29 07:49:01