我想从tcp套接字接收二进制数据(如.pdf或.doc),这里是代码:
发送文件:
fs.readFile(path, function (err, data) {
var client = new net.Socket();
client.connect(user_port, user_ip, function () {
client.write(data, 'binary');
client.destroy();
});
});
接收文件:
net.createServer(function(socket){
socket.setEncoding('binary');
socket.on('data', function (data) {
var file_data = new Buffer(data, 'binary');
fs.appendFile(utils.getUserDir() + '/my_file.doc', file_data);
});
socket.on('error', function(err){
console.log(err.message);
})
}).listen(utils.getPort(), utils.getExternalIp());
由于文件对于只有一个tcp套接字而言太大,它们会以多个数据包发送,实际上同一个文件有多个“数据”事件。
我认为可以将每个Buffer()
数据附加到文件中,但是当我打开.doc时,他已损坏或包含二进制内容。
PS:我不能使用Buffer().concat
并保存文件,因为我不知道哪个数据包是最后一个...
谢谢
答案 0 :(得分:3)
对于发送这样的文件,最好将它们流式传输而不是将它们全部缓冲到内存中然后发送它。 (此外,您不需要'binary'
编码参数,因为fs.readFile()
默认情况下会为您提供缓冲区)
例如:
var client = new net.Socket();
client.connect(user_port, user_ip, function() {
fs.createReadStream(path).pipe(client);
});
// ...
net.createServer(function(socket){
socket.pipe(fs.createWriteStream(utils.getUserDir() + '/my_file.doc'));
socket.on('error', function(err){
console.log(err.message);
});
}).listen(utils.getPort(), utils.getExternalIp());