Node.js-Socket.io-使用“发布”;“最大并发连接数”;

Node.js-Socket.io-使用“发布”;“最大并发连接数”;,node.js,sockets,Node.js,Sockets,我有一个socket.io nodejs应用程序问题(在Windows Azure中)。它工作正常,但过了一段时间,我收到一个错误,服务器回复为: HTTP/1.1 503活动WebSocket请求数已达到允许的最大并发WebSocket请求数 我在WindowsAzure上执行基本计划,根据这篇文章,我可以有350个并发连接 我正在使用Windows Azure日志计算活动套接字的数量,在350个套接字连接(和断开)的确切位置,服务器会回复错误 服务器设置: var client_id =

我有一个socket.io nodejs应用程序问题(在Windows Azure中)。它工作正常,但过了一段时间,我收到一个错误,服务器回复为:

HTTP/1.1 503活动WebSocket请求数已达到允许的最大并发WebSocket请求数

  • 我在WindowsAzure上执行基本计划,根据这篇文章,我可以有350个并发连接
  • 我正在使用Windows Azure日志计算活动套接字的数量,在350个套接字连接(和断开)的确切位置,服务器会回复错误
服务器设置:

var client_id = 0;
var connectCounter = 0;

var server = http.createServer(function(req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  console.log('server init.');
}).listen(port);
io = io.listen(server);

io.sockets.on('connection', function(socket)
{
    socket.client_id = client_id;
    client_id++;
    connectCounter++;
    console.log('A socket with client_id ' + socket.client_id + ' connected!');
    console.log('Sockets counter: ' + connectCounter);

    socket.on('disconnect', function() {
        console.log('A socket with client_id ' + socket.client_id + ' disconnected!');
        connectCounter--;
        console.log('Sockets counter: ' + connectCounter);
    });
});
末尾的日志示例:

A socket with client_id 349 connected!
Sockets counter: 1 
A socket with client_id 350 connected!
Sockets counter: 2 
A socket with client_id 349 disconnected! 
Sockets counter: 1 
A socket with client_id 350 disconnected! 
Sockets counter: 0

因为我的套接字正在连接和断开连接,所以不应该有350个并发连接。我做错了什么?

根据我的评论,问题很可能存在于
引擎.io
模块中的一个bug中,该模块是
套接字.io
的一个组件。表面上,原因是
engine.io
在检测ping超时时没有关闭tcp套接字

在a中,他们显然通过向位于以下路径的文件添加
self.transport.close()
调用来修补该错误:

node_modules/socket.io/node_modules/engine.io/lib/socket.js
应该在节点应用程序目录中的某个位置

我在上找到了代码行。代码如下:

Socket.prototype.setPingTimeout = function () {
    var self = this;
    clearTimeout(self.pingTimeoutTimer);
    self.pingTimeoutTimer = setTimeout(function () {
        self.onClose('ping timeout');
        self.transport.close(); // This is the added line
    }, self.server.pingInterval + self.server.pingTimeout);
};

试试看,它可能会解决您的问题。

看看这个,显然调用了
this.transport.close()
关闭TCP套接字,这些套接字应该在ping超时时被销毁:可能应该问一下,您使用的是PaaS还是IaaS?i、 例如,您是否完全控制运行nodeJS的VM?我已经对它进行了测试,我会让您知道结果。谢谢你的发现,这就是问题所在!现在,20小时后它似乎工作正常。@xinaris你不是很喜欢互联网吗?