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)
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 库,如 http
或 http2
。以下是使用 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!”);