从Nodejs中的套接字接收大型二进制数据

时间:2016-03-24 22:36:43

标签: node.js sockets tcp binary electron

我想从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并保存文件,因为我不知道哪个数据包是最后一个...

谢谢

1 个答案:

答案 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());