Socket.io:如何从客户端限制发射数据的大小,网页套接字服务器
我有一个socket.io服务器的node.js。我的客户端使用socket.io连接到服务器的node.js。
数据从客户端发送到服务器通过以下方式:
在客户端
var Data = {'data1':'somedata1', 'data2':'somedata2'};
socket.emit('SendToServer', Data);
在服务器
socket.on('SendToServer', function(Data) {
for (var key in Data) {
// Do some work with Data[key]
}
});
假设有人修改了他的客户并发出给服务器的数据的一个非常大的一块。例如:
var Data = {'data1':'somedata1', 'data2':'somedata2', ...and so on until he reach for example 'data100000':'data100000'};
socket.emit('SendToServer', Data);
由于这种循环在服务器上的...
for (var key in Data) {
// Do some work with Data[key]
}
...服务器将需要很长的时间来遍历所有这些数据。
那么,什么是为了防止这样的情况下最好的解决办法?
谢谢
编辑:
我用这个功能来验证对象:
function ValidateObject(obj) {
var i = 0;
for(var key in obj) {
i++;
if (i > 10) { // object is too big
return false;
}
}
return false;
}
回答如下:
所以,最简单的事情做它做任何事情之前只检查数据的大小。
socket.on('someevent', function (data) {
if (JSON.stringify(data).length > 10000) //roughly 10 bytes
return;
console.log('valid data: ' + data);
});
说实话,这是有点低效率。您的客户端发送消息,socket.io解析消息成一个对象,然后你得到的事件,并把它放回一个字符串。
如果你想成为更有效,那么在客户端,你应该执行的消息的最大长度。
为了获得更大的效率(并防止恶意用户),如数据包进入Socket.io,如果长度变得很长,那么你应该将它们丢弃。你要么需要想法子延长原型,做你想要什么,或者你需要拉源并修改它自己。另外,我还没有研究的socket.io协议,但我敢肯定,你所要做的不仅仅是“抛弃”的数据包。此外,一些数据包的ACK的挫折和NACK的挫折,所以你不想惹这些,无论是。
附注:如果你只关心按键的数量,那么你可以使用Object.keys(obj)
返回键的数组:
if (Object.keys(obj).length > 10)
return;