NodeJS网络传输随着长度的长度而线性增加



目标是使用 nodejs http 服务器交付文件。

问题是从服务器响应到浏览器传输

我提供字符串作为内容,如程序代码所示。

VPS: debian 7/SSD/2 核心/~30ms ping

相关:node.js response.write(data) 当数据大小较小时需要很长时间

一些字符串大小基准测试(内容下载时间

-   1 kb:   0,18 ms
-  10 kb:   7,00 ms
-  20 kb:  47,50 ms
-  30 kb:  55,00 ms
-  40 kb:  58,10 ms
-  50 kb:  86,20 ms
-  60 kb:  93,10 ms
-  80 kb: 107,10 ms
- 100 kb: 120,00 ms (nginx needs 0.31ms)

程序代码:

// var request => the http incoming request
request.socket.setNoDelay();
request.connection.setNoDelay();
// var response => the response from the http incoming request
response.on('close', function () {
  console.log("[ABORTED][%s] %s", request.connection.remoteAddress, request.url);
});
response.on('finish', function () {
  console.log("[SUCCESS][%s] %s", request.connection.remoteAddress, request.url);
});
// get the content of the file (takes ~0ms)
var fileContent = fileSystem.readFileSync(filePath, 'utf8');
// Configure response header
response.writeHead(200, {
  'content-length': ''+fileContent.length,
  'content-type': 'text/plain',
});
// Send content
response.end(fileContent, 'utf8', function(){
  console.log("Ending response took %sms", Date.now()-timeB2);
});

TL;DR:

改变

response.writeHead(200, {
  'Content-Type': 'text',
  'Content-Length': stat.size
});

response.writeHead(200, {
  'Content-Type': 'application/arraybuffer',
  'Content-Length': stat.size
}); 

长版本:问题是内容长度是错误的。 事实上,标头的信息是错误的,因为createReadStream返回一个缓冲区(数字数组),而不是文本。

如果要以文本形式发送,只需使用

response.end(readFileSync (filePath, 'utf8'));

它将自动构造正确的标头。 否则,您将需要找到"字符数"作为内容长度,并将编码传递给createReadStream,即:

var readStream = fileSystem.createReadStream(filePath, 'utf8');

我不知道在文本文档中获取"字符数"的简单方法。

另一种方法是将其作为应用程序/数组缓冲区发送,内容长度作为缓冲区的字节长度。 当您使用 stat.size 时,它实际上是文件字节大小,如果要将其读取为缓冲区流,则相当于 byteLength。

所以

,没有问题。

内容下载时间根据我的网络速度而定。

区别在于压缩和缓存。Nginx速度更快,因为它使用某种类型的压缩和缓存。

为了获得更好的结果,我将SPDY和GZIP添加到我的nodejs应用程序中,结果几乎与nginx相同。

相关内容

  • 没有找到相关文章

最新更新