gpt4 book ai didi

node.js - 连接:keep-alive is not keeping the socket connection for HTTP request in NodeJS

转载 作者:行者123 更新时间:2023-12-03 11:50:59 26 4
gpt4 key购买 nike

我听说 Connection:Keep-Alive header 会告诉服务器将客户端和服务器之间的连接保持一段时间,以防止每次客户端向服务器建立请求时都要付出努力。我尝试将其添加到请求的 header 中,但没有按预期工作。套接字连接仍然会在每次请求时关闭。

您能帮忙解释一下为什么会发生这种情况吗?我是否遗漏了有关 Connection:Keep-Alive 的内容,或者我是否以错误的方式实现了它?

客户:

const http = require("http");

const options = {
port: 4000,
headers: {
connection: "keep-alive",
},
};

function request() {
console.log(`making a request`);

const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

res.setEncoding("utf8");
res.on("data", (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on("end", () => {
console.log("No more data in response.");
});
});

req.on("error", (e) => {
console.error(`problem with request: ${e.message}`);
});

req.end();
}

setInterval(() => {
request();
}, 3000);

服务器:

const http = require("http");

const server = http.createServer((req, res) => {
setTimeout(() => {
res.end();
}, 500);
});

server.on("connection", function (socket) {
socket.id = Date.now();
console.log(
"A new connection was made by a client." + ` SOCKET ${socket.id}`
);
socket.on("end", function () {
console.log(
`SOCKET ${socket.id} END: other end of the socket sends a FIN packet`
);
});

socket.on("timeout", function () {
console.log(`SOCKET ${socket.id} TIMEOUT`);
});

socket.on("error", function (error) {
console.log(`SOCKET ${socket.id} ERROR: ` + JSON.stringify(error));
});

socket.on("close", function (had_error) {
console.log(`SOCKET ${socket.id} CLOSED. IT WAS ERROR: ` + had_error);
});
});
server.on("clientError", (err, socket) => {
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
});

server.listen(4000);

这就是我所得到的:

客户:

making a request
STATUS: 200
HEADERS: {"date":"Thu, 09 Apr 2020 13:05:44 GMT","connection":"keep-alive","content-length":"81"}
No more data in response.

making a request
STATUS: 200
HEADERS: {"date":"Thu, 09 Apr 2020 13:05:47 GMT","connection":"keep-alive","content-length":"81"}
No more data in response.

making a request
STATUS: 200
HEADERS: {"date":"Thu, 09 Apr 2020 13:05:50 GMT","connection":"keep-alive","content-length":"81"}
No more data in response.

和服务器:

A new connection was made by a client. SOCKET 1586437543111
{ connection: 'keep-alive', host: 'localhost:1234' }
SOCKET 1586437543111 END: other end of the socket sends a FIN packet
SOCKET 1586437543111 CLOSED. IT WAS ERROR: false

A new connection was made by a client. SOCKET 1586437546091
{ connection: 'keep-alive', host: 'localhost:1234' }
SOCKET 1586437546091 END: other end of the socket sends a FIN packet
SOCKET 1586437546091 CLOSED. IT WAS ERROR: false

A new connection was made by a client. SOCKET 1586437549095
{ connection: 'keep-alive', host: 'localhost:1234' }
SOCKET 1586437549095 END: other end of the socket sends a FIN packet
SOCKET 1586437549095 CLOSED. IT WAS ERROR: false

NodeJS 版本:10.15.0


还有一件事让我更加困惑,那就是当我使用 telnet localhost 1234 发出请求时:

GET / HTTP/1.1
Connection: Keep-Alive
Host: localhost

然后连接未关闭,并且没有按预期创建新连接。是因为 telnet 接收 Connection: Keep-Alive 并自行保持连接吗?

最佳答案

I have heard that Connection:Keep-Alive header will tell the server to keep the connection between client and server for a while to prevent the effort for each time client establish a request to server.

这是错误的。客户端不对服务器提出任何要求,只是向服务器提出一些建议。

Connection: keep-alive 只是告诉服务器客户端愿意保持连接打开以便发送更多请求。并且隐含地表明,如果服务器能够执行相同的操作以便重用现有连接来处理更多请求,那就太好了。然后,服务器可以自行决定是在发送响应后保持连接打开,还是立即关闭连接,或者在某些不活动或其他情况后关闭连接。

当然,客户端仅发送 HTTP header 是不够的(无论如何,HTTP/1.1 中都是隐式的,因此无需发送它)。它实际上必须保持 TCP 连接打开,以便在同一 TCP 连接上发送更多请求。从服务器日志中可以看出,您当前的实现不会执行此操作,即客户端首先关闭连接:

SOCKET 1586437549095 END: other end of the socket sends a FIN packet

为了在客户端真正保持事件状态,您可以使用代理通过多个 http.request 保持连接打开。请参阅HTTP keep-alive in node.js了解更多。

关于node.js - 连接:keep-alive is not keeping the socket connection for HTTP request in NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61122439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com