我需要为使用http.request进行的两次连接调用重用socket。我尝试传递自定义代理限制数量的套接字,但在第二次连接调用由代码进行之前删除了第一个套接字: https://github.com/nodejs/node/blob/master/lib/_http_client.js#L438
模拟代码:
var options = {
method: 'CONNECT', agent: new http.Agent({ keepAlive: true, maxSockets: 1 })
};
var request = this.httpModule.request(options);
request.on('connect', (res, sock, head) => {
console.log(sock.address());
// some processing...
var request2 = this.httpModule.request(options);
request2.on('connect', (res, sock, head) => {
console.log(sock.address());
});
request2.end();
});
request.end();
我是否可以通过某种方式为两个连接调用重用相同的套接字?
答案 0 :(得分:2)
这种形式的沟通需要两个独特的套接字。
在这种情况下,每个套接字代表客户端和服务器之间的连接。没有这样的套接字代表n
个客户端和一个服务器,可以这么说。它们在这里也不像“线程”,其中一个套接字可以为许多客户端执行工作。
通过将max sockets设置为1,您已经请求任何时候只有1个客户端连接处于活动状态。当您尝试连接第二个客户端时,它会杀死第一个客户端,因为达到了最大值,我们需要空间来建立新连接!
如果你想回收套接字 - 例如,客户端连接,一小时后刷新页面,同一个客户端触发另一个连接 - 在技术堆栈中可能没有办法做到这么高,并且它会远比破坏旧套接字更为复杂和不必要,无论如何都要为新套接字让路。如果您不明白为什么要或不需要这样做,则不需要这样做。
如果您想向许多客户发送消息(并且您希望在问题中“在一个套接字下完成”),请考虑使用broadcast
和emit
方法。