Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.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 如何限制客户端通过websocket发送的数据量?_Javascript_Node.js_Express_Websocket_Limit - Fatal编程技术网

Javascript 如何限制客户端通过websocket发送的数据量?

Javascript 如何限制客户端通过websocket发送的数据量?,javascript,node.js,express,websocket,limit,Javascript,Node.js,Express,Websocket,Limit,我正在使用ws模块,我想将客户端通过websocket发送的数据量限制为1Mb。这将防止恶意用户发送大量数据(以GB为单位),导致服务器内存不足,从而导致每个正常用户都出现拒绝服务错误 例如,example Express允许指定post请求正文的最大大小,如下所示: bodyParser.json({limit:'1Mb'}) 如何使用ws模块执行类似操作?我尝试了 var ws = require('ws').Server var wsserver = new ws({port:8080,

我正在使用
ws
模块,我想将客户端通过websocket发送的数据量限制为1Mb。这将防止恶意用户发送大量数据(以GB为单位),导致服务器内存不足,从而导致每个正常用户都出现拒绝服务错误
例如,example Express允许指定post请求正文的最大大小,如下所示:

bodyParser.json({limit:'1Mb'})
如何使用
ws
模块执行类似操作?
我尝试了

var ws = require('ws').Server
var wsserver = new ws({port:8080, limit:'1Mb'})
但这当然不行。
我希望数据传输中断(超过1Mb后),关闭websocket连接。我该怎么做?
必须有一种方法来限制来自客户端的数据帧…

该库中(当前)不存在该功能

翻看他们的源代码,似乎应该从中的
processPacket()
方法开始

一旦您有了可用的数据包头,您就可以看到正在发送的消息的大小。如果它高于某个阈值,那么应该有一种方法在所有字节都到达您的网络之前关闭连接

当然,最好的做法是分叉他们的存储库,发出一个功能请求,添加一个配置选项,该选项默认为在未设置时不采取任何操作(不要破坏向后兼容性),然后提交一个请求


如果他们喜欢,他们会合并的。如果没有,您仍然可以将他们未来的版本合并到您自己的回购协议中,并保持最新,而无需在他们每次提交新版本时重新进行工作。

估计还没有人知道。。。您正在使用哪个
ws
库?如果您正在使用的webSocket库的文档中没有答案,那么只能通过研究该库的代码来确定答案,以查看它是否具有任何类型的限制功能,或者了解可以在何处更改代码以添加此类限制。这听起来是个合理的要求。@jfriend00在这里。显然,在文档中,选项参数没有这样做的属性。也许有一个wsServer实例的方法可以设置限制。yay:has
maxLength
目前不支持长度超过32位的
数据包实例。更改导致该错误的最大长度条件可能是一种简单的方法,虽然我不确定声明某个长度但实际持续时间更长的帧会发生什么情况。WebSockets RFC中指定数据包长度超过32位的情况为有效消息长度,由于它改变了帧头的大小,因此需要进行特殊处理。大小超过4GB的消息。由于TCP在高延迟连接上处理非常小的消息的方式,在达到WebSockets帧的总长度后,TCP帧中有更多数据的消息也是一种有效的情况。Nagle的算法将在TCP层将多个消息合并在一起,导致多个WebSocket帧进入同一网络读取,如果服务器不检查消息,则可能会携带丢失的消息。。。虽然这只发生在一系列非常短的消息上是合法的。。。它永远不会合法地出现在大小接近4GB的消息上。我复制的错误消息具有误导性。它所讨论的帧的有效负载长度超过32位。它实际上与数据包无关。而且,超过32位的长度也不是特例;特殊情况是超过8位和超过16位。这是JavaScript无法很好地表示64位整数的一个问题,因此维护人员选择将有效负载长度任意限制为32位。