You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS中Connection:keep-alive无法保持Socket连接的问题求助

问题解析:Node.js HTTP客户端添加Connection:Keep-Alive后仍无法维持连接

首先,你的理解完全正确:Connection: Keep-Alive的作用确实是告知服务器保持TCP连接,避免重复建立连接带来的开销。问题并非出在你的理解上,而是Node.js http模块的默认行为导致了不符合预期的结果。

为什么你的Node.js客户端代码不生效?

在你使用的Node.js v10.15.0版本中,负责管理HTTP连接池的http.Agent模块,其keepAlive选项默认是关闭状态。哪怕你在请求头里手动添加了connection: "keep-alive",默认Agent并不会主动复用已有的TCP连接——每次调用http.request()都会创建新的socket连接,请求完成后就直接关闭它。

而你用telnet测试时能正常维持连接,是因为telnet是手动维护socket的工具:当服务器返回Connection: keep-alive响应头后,telnet不会主动发送FIN包关闭连接,所以后续请求可以复用同一个连接。

如何修改代码实现连接复用?

你需要手动创建一个开启keepAlive的Agent,并在请求选项中指定它。修改后的客户端代码如下:

const http = require("http");

// 创建开启keepAlive的自定义Agent
const agent = new http.Agent({
  keepAlive: true,
  keepAliveMsecs: 3000 // 闲置连接保持活跃的时长,可根据业务调整
});

const options = {
  port: 4000,
  headers: {
    connection: "keep-alive",
  },
  agent: agent // 绑定自定义Agent到请求选项
};

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);

修改后重新运行,你会看到服务端只会打印一次连接建立的日志,后续请求都会复用同一个socket,不会再频繁关闭和新建连接。

额外补充说明

  • 从Node.js v14版本开始,http.Agent的keepAlive默认值改为true,所以在更高版本的Node.js中,你的原始代码可能会自动实现连接复用。
  • 自定义Agent时,keepAliveMsecs用于设置闲置连接的存活时长,超过这个时间后Agent会自动关闭闲置连接,避免不必要的资源占用。

内容的提问来源于stack exchange,提问作者Toan Quoc Ho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:12:45