我听说,Connection:Keep-Alive
标头将告诉服务器在客户端和服务器之间保持一段时间的连接,以防止客户端每次向服务器建立请求时所做的工作。我试图将其添加到请求的标头中,但未按预期进行。套接字连接仍然在每个请求上关闭。
您能帮忙解释一下为什么会这样吗?我是否遗漏了某些东西,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
并保持连接吗?
我听说Connection:Keep-Alive标头会告诉服务器在客户端和服务器之间保持一段时间的连接,以防止每次客户端向服务器建立请求时都需要付出努力。
错了 客户端不要求服务器提供任何东西,它只是向服务器提出建议。
Connection: keep-alive
只是告诉服务器客户端将愿意保持连接打开以便发送更多请求。并暗示暗示,如果服务器为重用现有连接以进行更多请求而执行相同的操作,那将是很好的。然后,服务器可以自行决定是在发送响应后保持连接打开还是立即关闭连接,还是在不活动或任何原因后关闭连接。
当然,仅客户机发送HTTP标头是不够的(无论如何,HTTP标头在HTTP / 1.1中是隐式的,因此不需要发送它)。它实际上必须保持TCP连接打开,以便在同一TCP连接上发送更多请求。从服务器日志中可以看到,您当前的实现将不会执行此操作,即客户端首先关闭了连接:
SOCKET 1586437549095 END: other end of the socket sends a FIN packet
为了使客户端真正保持活动状态,您可以使用一个代理,该代理通过多个使连接保持打开状态http.request
。有关更多信息,请参见node.js中的HTTP keep-alive。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句