Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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 在js中调用emit_Javascript_Node.js_Socket.io_Eventemitter - Fatal编程技术网

Javascript 在js中调用emit

Javascript 在js中调用emit,javascript,node.js,socket.io,eventemitter,Javascript,Node.js,Socket.io,Eventemitter,我一直试图回答如果emit没有任何注册的侦听器会发生什么 如果客户端在没有任何侦听器的情况下通过emit进行垃圾邮件发送,是否会导致漏洞 while(true){ socket.emit('not_registered_event_string'); } 如果没有任何侦听器,则不会导致任何问题。EventEmitter对象将只检查您传入的消息名称,以获得侦听器列表,并且将找不到侦听器,因此不会执行任何操作 但是,服务器中的此循环: while(true){ socket.emi

我一直试图回答如果emit没有任何注册的侦听器会发生什么

如果客户端在没有任何侦听器的情况下通过emit进行垃圾邮件发送,是否会导致漏洞

while(true){
    socket.emit('not_registered_event_string');
}

如果没有任何侦听器,则不会导致任何问题。
EventEmitter
对象将只检查您传入的消息名称,以获得侦听器列表,并且将找不到侦听器,因此不会执行任何操作

但是,服务器中的此循环:

while(true){
    socket.emit('not_registered_event_string');
}
是一个无限循环,将阻止node.js进程执行任何其他操作。它将永远卡在这个循环中,无法处理任何其他事件或执行任何其他操作

这是因为node.js在一个线程中运行Javascript,因此只要该线程在上述
循环中循环,它就不能处理任何其他消息或执行任何其他操作。node.js是一个事件驱动的环境。您收到一个事件,处理该事件,将控制权返回系统,然后系统可以处理下一个事件。如果您一直循环,则不会处理任何事件,并且您的node.js进程将显示为挂起(即使您的循环可能仍在运行)


客户端中的相同循环只会向服务器发送大量消息。服务器可能可以很好地处理它们,因为如果没有侦听器,那么在接收它们时基本上没有什么可做的。但是,仅仅处理空消息就会占用服务器的带宽和CPU

如果您想保护服务器不受客户端垃圾邮件事件的影响,您可以对客户端进行“速率限制”,如果它超过每秒或每分钟的特定消息速率,您可以直接断开其连接。速率限制是一个研究得很好的主题,许多文章都提到了这个主题,并且有许多带有node.js预构建包的方案来帮助实现速率限制。我读到的一个常见的例子是


速率限制是服务器保护自己免受恶意客户端攻击的常见方式。如果继续滥用,您甚至可能会暂停或撤销对您网站的帐户访问,因此该帐户甚至无法登录到您的网站。像谷歌这样的人在他们的大部分(也许是全部)服务上使用速率限制来保护他们免受意外或有目的的过载攻击。

不,这可能很容易……一种
的“leacky bucket算法”
被用在
套接字反垃圾邮件
包中,用于计算可用的
垃圾邮件存储
值。当该值超过某个树阈值时,库将应用两级规则。它断开的客户端拒绝尝试重新连接。它还可以在这段时间内自动倒计时。但不幸的是,它只适用于具有注册侦听器的事件。它不会为没有连接侦听器的事件添加
spamcore
。但是检查这个事件也需要执行时间和CPU。@MaxBender-是的,速率限制需要一点CPU来进行计数。这是无法避免的。你要么想要/需要利率限制,要么不想要。您还可以使用代理,如Nginx,并在该级别执行速率限制。