新的答案
绝对是IO客户端中的错误。 :(
我能够通过修改socket.io的客户端/库/ socket.js解决此问题。围绕线433,我简单移动上述if (wasConnected) {
的this.publish('disconnect', reason);
。
Socket.prototype.onDisconnect = function (reason) {
var wasConnected = this.connected;
this.publish('disconnect', reason);
this.connected = false;
this.connecting = false;
this.open = false;
if (wasConnected) {
this.transport.close();
this.transport.clearTimeouts();
按CTRL + C后,断开消息大火大约10秒
OLD讨论
要通知关闭事件的客户端,可以添加这样的事情demo_server.js:
var logger = io.log;
process.on('uncaughtException', function (err) {
if(io && io.socket) {
io.socket.broadcast.send({type: 'error', msg: err.toString(), stack: err.stack});
}
logger.error(err);
logger.error(err.stack);
//todo should we have some default resetting (restart server?)
app.close();
process.exit(-1);
});
process.on('SIGHUP', function() {
logger.error('Got SIGHUP signal.');
if(io && io.socket) {
io.socket.broadcast.send({type: 'error', msg: 'server disconnected with SIGHUP'});
}
//todo what happens on a sighup??
//todo if you're using upstart, just call restart node demo_server.js
});
process.on('SIGTERM', function() {
logger.error('Shutting down.');
if(io && io.socket) {
io.socket.broadcast.send({type: 'error', msg: 'server disconnected with SIGTERM'});
}
app.close();
process.exit(-1);
});
当然,你在broadcast.send发送(...)(或者甚至是命令你用有)取决于你的喜好和客户结构。
对于客户端,你可以告诉我们,如果服务器连接使用的(“断开”,...),你在你的例子已经失去了:
client.on('disconnect', function(data) {
alert('disconnected from server; reconnecting...');
// and so on...
});
这是非常合理的,但不真的是我在找什么。有些情况下,服务器可能会在没有机会自行清理的情况下死亡。考虑一下SIGKILL信号,它不能被捕获,或者是电源故障。显然,客户端知道服务器已经消失,因为它运行完成 - 我希望客户端可靠地触发回调,以便在此事件中执行某些操作。不过谢谢您的意见! – zslayton 2011-12-27 20:22:49
所以你要找的是一种方式,在客户端,告诉服务器的连接是否超时?我认为你只需要将“断开”替换为“断开”;我不知道我在哪里找到了这个,但我在我的节点应用程序中使用它(示例添加到我的答案中) – Kato 2011-12-27 20:35:52
另外,不要忘记,您可以告诉客户端自动重新连接:io_client.connect(url,{reconnect :true}); – Kato 2011-12-27 20:38:19