Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';t io.emit()在进程中工作。在()上?_Javascript_Node.js_Express_Socket.io - Fatal编程技术网

Javascript 为什么';t io.emit()在进程中工作。在()上?

Javascript 为什么';t io.emit()在进程中工作。在()上?,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,我正在尝试应用,以便服务器在关闭时通知客户端。我不明白服务器为什么不发射。程序似乎在有机会发出之前就关闭了,但是console.log()可以工作。我认为我的问题可能与前面提到的process.on的同步性质有关,但老实说,我对(a)synchronous在本文中的真正含义理解不够。另外,如果有帮助的话,我使用的是Windows7 // catch ctrl+c event and exit normally process.on('SIGINT', function (code) {

我正在尝试应用,以便服务器在关闭时通知客户端。我不明白服务器为什么不发射。程序似乎在有机会发出之前就关闭了,但是console.log()可以工作。我认为我的问题可能与前面提到的process.on的同步性质有关,但老实说,我对(a)synchronous在本文中的真正含义理解不够。另外,如果有帮助的话,我使用的是Windows7

  // 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);
    });
我今天才开始胡闹,所以请原谅我的无知。非常感谢您的帮助

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

process.exit()
立即生效

在通过TCP成功发送和确认消息之前,您可能会关闭应用程序及其拥有的所有资源

一种可能的解决方法是执行
过程。在稍微延迟的情况下退出(2)
,这样TCP堆栈就有机会在关闭之前发送数据

另一种可能是避免最后的聊天信息。客户端将很快看到与服务器的连接已关闭,并且无法重新连接,因此它应该配备向用户显示该信息的设备(在服务器崩溃的情况下)


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

可能是io.emit中的某些东西是异步的。您可能需要询问socket.io支持是否有同步版本。