如何让两个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
相关产品推荐
相关产品推荐

