【问题标题】:How to send file over TCP in one time in Nodejs如何在 Nodejs 中一次性通过 TCP 发送文件
【发布时间】:2016-04-04 08:38:11
【问题描述】:

我想使用 Nodejs 通过 tcp/ip 发送文件,我使用大小小于 65536 字节的文件成功了。

你设置缓冲区大小吗?是的,我愿意。

我尝试发送 233565 字节的图片,但看起来 nodejs 将我的文件分开发送多次。

这是我的示例代码

服务器.js

const net = require('net');
net.bytesWritten = 300000;
net.bufferSize = 300000;
const fs = require('fs');
const server = net.createServer((c) => {
  // 'connection' listener
  console.log('client connected');
  c.on('end', () => {
    console.log('client disconnected');
  });
  // c.write('hello\r\n');
  fs.readFile('daemon0.png' , (err, data) =>{
    if(!err){
      console.log(data.length);
      c.write(data);
    }
    else {
      console.log('readfile daemon0 err');
    }
  });
  c.pipe(c);
});
server.on('error', (err) => {
  throw err;
});
server.listen(8124, 'localhost', () => {
  console.log('server bound');
});

Server.js 输出

server bound

client connected

233565

client disconnected

客户端.js

const net = require('net');
net.bufferSize = 300000;
net.bytesRead = 300000;
const client = net.connect({port: 8124, address: 'localhost' }, () => {
  // 'connect' listener
  console.log('connected to server!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  // console.log(data.toString());
  console.log(net.bufferSize,data.length);
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
});

Client.js 输出

connected to server!

300000 5840

300000 65536

300000 65536

300000 65536

300000 31125

disconnected from server

作为客户端的两个输出,客户端似乎有接收数据的限制,最大为 65536 字节。如何扩展 TCP nodejs 中的缓冲区大小限制?

我在nodejs gitter chatmpotra 中问这个问题,回答这个对我来说是有意义的解释。

这不是问题。 这就是流媒体的工作原理:将大的东西发送到较小的数据包中。 如果您唯一的愿望是增加缓冲区大小以便将文件接收到一个数据事件中,那么您的想法就错了。如果您的文件有 500MB,根据您的预期,服务器和客户端都必须分配 500MB!入内存,只为满足单个数据事件的需要;这显然是错误的数据传输方法。

【问题讨论】:

    标签: node.js tcp


    【解决方案1】:

    Node 正在发送整个 Buffer 就好了,但是您的客户端会以块的形式发出数据事件。如果要接收整个文件,则需要缓冲块:

    const chunks = []
    client.on('data', chunk => chunks.push(chunk))
    client.on('end', () => {
      const file = Buffer.concat(chunks)
      // do what you want with it
    })
    

    我不知道在 Node 中控制何时发出数据事件的方法。

    【讨论】:

      【解决方案2】:

      我认为您需要调整内核缓冲区:

      # echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
      # echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
      # echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
      # echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf
      # echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
      # echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf
      # echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
      # echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
      # echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
      //reload
      sysctl -p
      //view changes
      tcpdump -ni eth0
      

      windows 看here

      【讨论】:

      • 您有实施链接供您参考吗?如何使用它 ?还是谢谢你。
      • 您只需要更改注册表项
      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 2015-11-01
      • 2017-01-10
      相关资源
      最近更新 更多