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

如何让两个HTTP请求复用同一个Socket?

如何让Node.js的两个HTTP请求复用同一个Socket?

当前代码中发起了两个HTTP POST请求,但实际运行时会创建两个独立的Socket连接。要实现Socket复用,核心是利用HTTP Keep-Alive机制,确保第二个请求在第一个请求的响应处理完成后再发起,同时保持Server和Agent的Keep-Alive配置正确。

问题原因

你的代码中两个请求是同步发起的:第一个请求的响应还未处理完成时,第二个请求就已发出。对于HTTP/1.1的Keep-Alive连接,同一时刻一个Socket只能处理一个请求,此时Agent会认为当前Socket被占用,因此创建新的Socket。

解决方案

1. 确保请求串行发起

将第二个请求放在第一个请求的响应回调中,等待第一个请求的响应完全处理完成后再发起第二个请求,此时Agent会将已完成的Socket放回连接池供复用。

修改后的核心代码如下:

// ... 保留原Server和Agent的配置代码

let req0 = request(
    { 
        agent: agent,
        hostname: '127.0.0.1',
        port: 3000,
        path: '/',
        method: 'POST'
    }, (res:IncomingMessage)=>{
        console.log(res.headers);
        // 第一个请求响应处理完成后,发起第二个请求
        let req1 = request(
            {
                agent: agent,
                hostname: '127.0.0.1',
                port: 3000,
                path: '/',
                method: 'POST'
            }, (res:IncomingMessage)=>{ 
                console.log(res.headers);
            });
        req1.end("1");
    });

req0.end("0");

2. 确认配置正确性

你的Server和Agent的Keep-Alive配置已经正确,无需修改:

  • Server端:new Server({ keepAlive: true}) 开启了Keep-Alive
  • Agent端:new Agent({ keepAlive: true, maxSockets: 1}) 开启了Keep-Alive,并限制每个目标的最大Socket数为1

修改后的效果

运行修改后的代码,会看到两个请求共用同一个Socket(通过remotePort一致可以验证),不会出现新的Socket.localPort和Socket.remotePort日志,也只会输出一次Socket_close。

补充说明

如果需要并发复用同一个Socket处理多个请求,则需要切换到HTTP/2协议。HTTP/1.1的Keep-Alive仅支持串行复用,同一Socket同一时刻只能处理一个请求;而HTTP/2的多路复用特性允许同一Socket同时处理多个请求。

内容的提问来源于stack exchange,提问作者stackhatter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:17:52