我是javascript世界的新手。最近,我正在用nodejs开发一个聊天应用程序。所以我有一个名为gracefulshutdown的方法,如下所示。
var gracefulShutdown = function() {
logger.info("Received kill signal, shutting down gracefully.");
server.close();
logger.info('Disconnecting all the socket.io clients');
if (Object.keys(io.sockets.sockets).length == 0) process.exit();
var _map = io.sockets.sockets,
_socket;
for (var _k in _map) {
if (_map.hasOwnProperty(_k)) {
_socket = _map[_k];
_socket.disconnect(true);
}
}
...code here...
setTimeout(function() {
logger.error("Could not close connections in time, shutting down");
process.exit();
}, 10 * 1000);
}
这里是在disconnect listener.The removeDisconnectedClient方法中发生的事情:简单地更新db中的条目以指示被移除的客户端。
socket.on('disconnect',function() { removeDisconnectedClient(socket);});
因此,在这种情况下,并没有为所有套接字触发disconnect事件。它只是从数组中随机地触发了几个套接字。虽然我在队友的帮助下用setTimeout(fn,0)解决了这个问题。
我在网上读到过它,我只了解到这一点,setTimeout通过将代码添加到事件队列的末尾来延迟代码的执行。我读到了javascript上下文,调用堆栈,事件循环。但我不能在这种情况下把所有这些都放在一起。我真的不明白为什么会发生这个问题,以及这个问题是如何发生的。有没有人能详细解释一下。以及解决或避免它们的最佳方法是什么。
发布于 2015-06-21 17:10:15
如果没有更多关于gracefulShutdown
中其他代码的上下文,很难说清楚,但我很惊讶它完全断开了任何套接字:
_socket = _map[ _k ];
socket.disconnect(true);
您似乎正在将_map
中的一项赋值给变量_socket
,但是随后在socket
上调用了disconnect
,这是一个不同的变量。我猜是打字错误,你的意思是在_socket
上调用disconnect
一些套接字可能由于其他原因而断开连接,而您的循环正在断开某些但不是所有套接字的外观可能只是巧合。
据我所知,从您发布的代码中可以看出,socket
应该为undefined
,并且您在尝试调用undefined
上的disconnect
方法时应该会收到错误。
发布于 2015-06-27 09:37:06
在Socket.io 1.0之后,该库不会向您公开已连接套接字的数组。你可以检查一下,io.socket.sockets.length,不等于打开的socket对象。你最好的办法就是广播一个“断开”消息给所有你想要关闭的客户端,然后打开。在客户端“断开”关闭实际的WebSocket。
https://stackoverflow.com/questions/30923931
复制相似问题