在 Nodejs 中从套接字接收大量二进制数据

Receive large binary data from socket in Nodejs

我想从 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 套接字来说太大了,它们是用多个数据包发送的,实际上同一个文件有多个 'data' 事件。 我认为可以将每个 Buffer() 数据附加到一个文件中,但是当我打开 .doc 时,他已损坏或其中包含二进制文件。

PS:我无法使用 Buffer().concat 并在之后保存文件,因为我不知道哪个数据包是最后一个...

谢谢

对于发送这样的文件,最好将它们流式传输而不是将其全部缓冲到内存中然后发送。 (此外,您不需要 '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());