2011-12-27 174 views
3

我已经写了一个这样的最简单的例子。代码发布在这里:https://gist.github.com/1524725当服务器被终止时,NodeJS socket.io-client不会触发'disconnect'或'close'事件

我启动我的服务器,启动我的客户端,验证两者之间的连接是否成功,最后使用CTRL + C终止服务器。当服务器死亡时,客户端立即运行完成并关闭,而无需在on_client_close或on_client_disconnect中打印消息。没有可察觉的延迟。

从我所做的阅读中,因为客户端进程正常终止,STDOUT缓冲区没有被刷新的机会。

也可能值得注意的是,当我杀死客户端而不是服务器时,服务器按照预期作出响应,触发on_ws_disconnect函数并从其活动客户端列表中删除客户端连接。

32位的Ubuntu 11.10 Socket.io v0.8.7 Socket.io客户端v0.8.7 的NodeJS v0.6.0

谢谢!

---编辑---

请注意,在客户端和服务器Node.js的过程,而不是传统的Web浏览器客户端和服务器的nod​​e.js。

回答

5

新的答案

绝对是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... 
}); 
+0

这是非常合理的,但不真的是我在找什么。有些情况下,服务器可能会在没有机会自行清理的情况下死亡。考虑一下SIGKILL信号,它不能被捕获,或者是电源故障。显然,客户端知道服务器已经消失,因为它运行完成 - 我希望客户端可靠地触发回调,以便在此事件中执行某些操作。不过谢谢您的意见! – zslayton 2011-12-27 20:22:49

+0

所以你要找的是一种方式,在客户端,告诉服务器的连接是否超时?我认为你只需要将“断开”替换为“断开”;我不知道我在哪里找到了这个,但我在我的节点应用程序中使用它(示例添加到我的答案中) – Kato 2011-12-27 20:35:52

+0

另外,不要忘记,您可以告诉客户端自动重新连接:io_client.connect(url,{reconnect :true}); – Kato 2011-12-27 20:38:19

相关问题