Nodejs 用net模块写测试服务器,浏览器可以打开,用ab做不了压力测试

Nodejs 用net模块写测试服务器,浏览器可以打开,用ab做不了压力测试

var net = require(‘net’);

var server = net.createServer(function (socket) { socket.write(“HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nhello world!”); socket.pipe(socket); }); server.listen(1337, ‘127.0.0.1’);

用浏览器/curl打开显示正常 用ab测试就提示 Benchmarking 127.0.0.1 (be patient)…apr_poll: The timeout specified has expired (70007) Benchmarking 127.0.0.1 (be patient)…apr_poll: The timeout specified has expired (70007)


3 回复

Node.js 用 net 模块写测试服务器,浏览器可以打开,但用 ab 做不了压力测试

问题描述

使用 Node.js 的 net 模块创建了一个简单的 HTTP 服务器,该服务器可以通过浏览器或 curl 正常访问。但是,当尝试使用 Apache Benchmark (ab) 进行压力测试时,会遇到超时错误。

示例代码

var net = require('net');

var server = net.createServer(function (socket) {
  // 发送 HTTP 响应头
  socket.write("HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\n");
  
  // 发送响应体
  socket.end("hello world!");
});

server.listen(1337, '127.0.0.1', function() {
  console.log('Server is listening on port 1337');
});

问题分析

net 模块本身并不是为 HTTP 协议设计的,它只是一个底层的 TCP 服务器。当你尝试通过 net 模块发送 HTTP 响应时,需要手动处理所有的细节,包括协议头和数据流。这导致了与 ab 等工具不兼容的问题。

解决方案

为了使服务器能够正确处理 HTTP 请求,并且能够通过 ab 进行压力测试,建议使用专门的 HTTP 库,如 httphttp2。以下是使用 http 模块的示例:

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Length': '12' });
  res.end('hello world!');
});

server.listen(1337, '127.0.0.1', () => {
  console.log('Server is listening on port 1337');
});

测试命令

使用 ab 进行压力测试:

ab -n 1000 -c 100 http://127.0.0.1:1337/

总结

使用 http 模块可以更好地处理 HTTP 协议,确保你的服务器能够与各种工具(如 ab)兼容。这样不仅解决了当前的问题,还能提高代码的可维护性和扩展性。


没见过这写法,直接一句就行了呀:

socket.end(“HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nhello world!”);

在使用 Node.js 的 net 模块创建服务器时,如果你希望它能够处理 HTTP 请求并支持压力测试(例如使用 Apache Bench (ab)),你需要确保你的服务器正确实现了 HTTP 协议。在你的示例中,虽然你可以通过浏览器或 curl 访问,但 ab 无法正常工作,因为它期望一个完整的 HTTP 服务器。

以下是一个更完整的示例,展示了如何使用 net 模块实现一个简单的 HTTP 服务器,并确保它可以正确响应 HTTP 请求:

const net = require('net');

const server = net.createServer((socket) => {
  // 设置 HTTP 响应头
  const headers = [
    'HTTP/1.1 200 OK',
    'Content-Type: text/plain',
    'Content-Length: 12',
    'Connection: close',
    '',
  ].join('\r\n');

  // 发送 HTTP 响应
  socket.end(headers + 'hello world!');
});

server.listen(1337, '127.0.0.1', () => {
  console.log('Server listening on port 1337');
});

解释

  1. HTTP 头:正确的 HTTP 响应需要包含标准的 HTTP 头信息。这包括状态行、内容类型、内容长度和连接类型。
  2. 结束响应:使用 socket.end() 方法来发送整个 HTTP 响应,包括头部和正文。
  3. Content-Length:明确指定响应体的长度,这对于客户端解析响应是必要的。
  4. Connection: close:确保连接在一次请求后关闭,这在 HTTP/1.1 中是可选的,但在某些情况下有助于避免问题。

通过这种方式,你的服务器应该能够正确响应 HTTP 请求,并且可以顺利进行压力测试。

回到顶部