Connection:keep-alive没有在NodeJS中保持HTTP请求的套接字连接

汤国浩

我听说,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并保持连接吗?

斯蒂芬·乌尔里希(Steffen Ullrich)

我听说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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

websocket与带有header connection-keep-alive = million的http有何不同

来自分类Dev

在C#(.net)下具有HTTP服务器的Keep-Alive套接字如何发送几个查询?

来自分类Dev

处理http Keep-Alive连接时,如何使用netty将响应映射到请求url

来自分类Dev

如何通过HttpClient以小写形式设置“ Connection:keep-alive”标头?

来自分类Dev

如何在Android主屏幕小部件中保持套接字连接有效

来自分类Dev

如何在java中保持连接套接字

来自分类Dev

Nodejs 套接字写入所有连接

来自分类Dev

尝试重用HTTP连接来处理Keep-Alive标头时,通过从客户端读取第二个请求来阻止recv

来自分类Dev

python keep-alive连接并下载图片

来自分类Dev

您可以通过HTTP代理使用CONNECT请求的Keep-Alive吗?

来自分类Dev

Explain http keep-alive mechanism

来自分类Dev

HTTP Keep-Alive 到不同的主机

来自分类Dev

SqlBulkCopy.WriteToServer() keep getting "connection is closed"

来自分类Dev

Java、HTTP 和套接字:何时停止读取请求但保持套接字打开?

来自分类Dev

Vuejs <keep-alive>有什么意义?

来自分类Dev

python套接字如何使用相同的套接字连接正确重定向http / s请求?

来自分类Dev

在活动android中保留套接字连接

来自分类Dev

带有HTTPS,SSL客户端证书和Keep-Alive支持的Ruby的HTTP库?

来自分类Dev

使用套接字的HTTP请求

来自分类Dev

没有这样的主机是已知的套接字连接

来自分类Dev

没有这样的主机是已知的套接字连接

来自分类Dev

Python请求使用Keep-alive加快速度

来自分类Dev

建立httpheader连接:保留小写的“ keep-alive”

来自分类Dev

建立httpheader连接:保留小写的“ keep-alive”

来自分类Dev

由于缺少Keep-Alive标头而导致HTTP 2上的Socket.io永久断开连接

来自分类Dev

保持套接字连接java android

来自分类Dev

HTTP Keep-Alive是否可以维持长时间的轮询?

来自分类Dev

通过套接字连接发送多个请求

来自分类Dev

发送请求时,nodejs套接字挂断

Related 相关文章

  1. 1

    websocket与带有header connection-keep-alive = million的http有何不同

  2. 2

    在C#(.net)下具有HTTP服务器的Keep-Alive套接字如何发送几个查询?

  3. 3

    处理http Keep-Alive连接时,如何使用netty将响应映射到请求url

  4. 4

    如何通过HttpClient以小写形式设置“ Connection:keep-alive”标头?

  5. 5

    如何在Android主屏幕小部件中保持套接字连接有效

  6. 6

    如何在java中保持连接套接字

  7. 7

    Nodejs 套接字写入所有连接

  8. 8

    尝试重用HTTP连接来处理Keep-Alive标头时,通过从客户端读取第二个请求来阻止recv

  9. 9

    python keep-alive连接并下载图片

  10. 10

    您可以通过HTTP代理使用CONNECT请求的Keep-Alive吗?

  11. 11

    Explain http keep-alive mechanism

  12. 12

    HTTP Keep-Alive 到不同的主机

  13. 13

    SqlBulkCopy.WriteToServer() keep getting "connection is closed"

  14. 14

    Java、HTTP 和套接字:何时停止读取请求但保持套接字打开?

  15. 15

    Vuejs <keep-alive>有什么意义?

  16. 16

    python套接字如何使用相同的套接字连接正确重定向http / s请求?

  17. 17

    在活动android中保留套接字连接

  18. 18

    带有HTTPS,SSL客户端证书和Keep-Alive支持的Ruby的HTTP库?

  19. 19

    使用套接字的HTTP请求

  20. 20

    没有这样的主机是已知的套接字连接

  21. 21

    没有这样的主机是已知的套接字连接

  22. 22

    Python请求使用Keep-alive加快速度

  23. 23

    建立httpheader连接:保留小写的“ keep-alive”

  24. 24

    建立httpheader连接:保留小写的“ keep-alive”

  25. 25

    由于缺少Keep-Alive标头而导致HTTP 2上的Socket.io永久断开连接

  26. 26

    保持套接字连接java android

  27. 27

    HTTP Keep-Alive是否可以维持长时间的轮询?

  28. 28

    通过套接字连接发送多个请求

  29. 29

    发送请求时,nodejs套接字挂断

热门标签

归档