我正在尝试申请this https://stackoverflow.com/questions/14031763/doing-a-cleanup-action-just-before-node-js-exits这样我的服务器就会在关闭时告诉客户端。我不明白为什么服务器不会发出。看起来程序在有机会发出之前就关闭了,但是 console.log() 可以工作。我认为我的问题可能与前面提到的 process.on 的同步性质有关here https://nodejs.org/api/process.html#process_event_exit,但老实说,我不太了解(a)同步在这种情况下的真正含义。另外,如果有帮助的话,我使用的是 Windows 7。
// catch ctrl+c event and exit normally
process.on('SIGINT', function (code) {
io.emit("chat message", "Server CLOSED");
console.log("Server CLOSED");
process.exit(2);
});
我今天才开始搞这些东西,所以请原谅我的无知。任何帮助是极大的赞赏!
完整的服务器代码。 http://pastebin.com/enUegWm9
io.emit()
是一个异步操作(你可以说它在后台工作)并且由于各种TCP优化(也许比如Nagle的算法),你的数据可能不会立即发送。
process.exit()
立即生效。
在消息通过 TCP 成功发送和确认之前,您可能会关闭应用程序及其拥有的所有资源。
一种可能的解决方法是执行process.exit(2)
稍有延迟,使 TCP 堆栈有机会在关闭之前发送数据。
另一种可能性是避免最后一条聊天消息。客户端很快就会发现与服务器的连接已关闭并且无法重新连接,因此无论如何都应该向用户显示该信息(在服务器崩溃的情况下)。
您还可以考虑关闭 Nagle 算法,该算法会在发送数据之前尝试等待一小会儿,以防您立即发送更多可以合并到同一个数据包中的数据。但是,要知道这是否可靠地工作,您必须在适当的平台上进行相当彻底的测试,并且即使关闭此功能也可能无法解决问题,因为这是 TCP 堆栈之间发送其缓冲数据的竞争以及关闭该进程拥有的所有资源(包括打开的套接字)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)