节点连接失败后重新使用套接字

时间:2018-02-28 17:05:21

标签: node.js

我需要为使用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();

我是否可以通过某种方式为两个连接调用重用相同的套接字?

1 个答案:

答案 0 :(得分:2)

这种形式的沟通需要两个独特的套接字。

在这种情况下,每个套接字代表客户端和服务器之间的连接。没有这样的套接字代表n个客户端和一个服务器,可以这么说。它们在这里也不像“线程”,其中一个套接字可以为许多客户端执行工作。

通过将max sockets设置为1,您已经请求任何时候只有1个客户端连接处于活动状态。当您尝试连接第二个客户端时,它会杀死第一个客户端,因为达到了最大值,我们需要空间来建立新连接!

如果你想回收套接字 - 例如,客户端连接,一小时后刷新页面,同一个客户端触发另一个连接 - 在技术堆栈中可能没有办法做到这么高,并且它会比破坏旧套接字更为复杂和不必要,无论如何都要为新套接字让路。如果您不明白为什么要或不需要这样做,则不需要这样做。

如果您想向许多客户发送消息(并且您希望在问题中“在一个套接字下完成”),请考虑使用broadcastemit方法。