【发布时间】: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 chat 和mpotra 中问这个问题,回答这个对我来说是有意义的解释。
这不是问题。 这就是流媒体的工作原理:将大的东西发送到较小的数据包中。 如果您唯一的愿望是增加缓冲区大小以便将文件接收到一个数据事件中,那么您的想法就错了。如果您的文件有 500MB,根据您的预期,服务器和客户端都必须分配 500MB!入内存,只为满足单个数据事件的需要;这显然是错误的数据传输方法。
【问题讨论】: