为什么io.emit()不在process.on()中工作?

时间:2015-10-16 00:32:02

标签: javascript node.js express socket.io

我正在尝试应用this,以便我的服务器在关闭时告诉客户端。我不明白为什么服务器不会发出。似乎程序在它有机会发出之前关闭,但是console.log()可以工作。我认为我的问题可能与process.on的同步特性有关,如上所述here,但老实说,我不太了解(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);
    });

我今天刚开始搞乱这些东西,请原谅我的无知。非常感谢任何帮助!

Full server code.

1 个答案:

答案 0 :(得分:5)

io.emit()是一个异步操作(你可以说它在后台运行)并且由于各种TCP优化(可能是诸如Nagle的算法),你的数据可能不会立即发送。

process.exit()立即生效。

您可能会在成功发送邮件并通过TCP确认之前关闭您的应用程序,从而关闭其拥有的所有资源。

一种可能的解决方法是稍微延迟process.exit(2),使TCP堆栈有机会在关闭数据之前发送数据。

另一种可能性是避免上次聊天消息。客户端很快就会看到与服务器的连接已关闭,并且无法重新连接,因此无论如何都应该为用户显示该信息(在服务器崩溃的情况下)。

您还可以考虑关闭Nagle算法,该算法在发送数据之前会尝试等待一小段时间,以防您立即发送更多可以合并到同一数据包中的数据。但是,要知道这是否能够可靠地工作,你必须在适当的平台上进行相当彻底的测试,甚至关闭它也可能无法解决问题,因为它是TCP堆栈之间的竞争,以发送其缓冲数据并关闭此进程拥有的所有资源(包括打开的套接字)。