【发布时间】:2015-09-16 01:21:58
【问题描述】:
我正在尝试限制 node.js 服务器上的 socket.io 连接时间。我问了一个先前的问题,如果我们在不同的房间中有 1000 个并发套接字连接,这是否可能不会在服务器上造成巨大的开销,或者阻塞主线程,例如:
socket.on('connection', function(params){
var maxTime = params.maxTime;
socket.join(params.roomId);
setTimeout(function{
socket.leave(params.roomId);
}, 180000)
});
最好的情况是从资源的角度在客户端处理这个问题,但是发送超时/断开值并不完全安全,因为处理它的任何客户端代码行都可以很容易地被操纵并且知道用户实际上可以阻止断开连接事件/功能被调用。
我可以在客户端执行一个以字符串形式发送的函数吗?说:
setTimeout(function(){//disconnect},18000);
socket.emit('timeout_set', function(params){foo:bar});
然后在服务器上适当地处理知道超时确实已设置的响应:
socket.on('timeout_set', function(params){
socket.emit('proceed_with_stuff', {foo:bar});//includes critical info for proceeding
});
我认为这取决于几件事:
- 您能否从服务器响应中获取一个字符串并将该字符串作为 JS 执行?
- 客户端能否在不触发 socket.disconnect 事件的情况下中断 setTimeout 函数?
- 这个逻辑或任何类似的可能吗?
- 如果有多个并发连接,第一个场景是否可以在 node.js 服务器上运行?
【问题讨论】:
-
是的,如果您发送的字符串是有效的 javascript,那么使用 eval 肯定是可能的。不过,我想不出任何情况下这样做是有意义的,而不是从逻辑客户端开始。
-
我主要关心以某种方式验证连接将从客户端终止并且不能被篡改......
-
但是,它是客户端的,它总是可以被篡改的。你不能阻止它。在消息事件的回调上添加断点将允许用户直接修改消息(字符串形式的函数)。
-
因此我需要做这个服务器端。 setTimeout 服务器端方法呢?考虑到并发连接和节点事件循环的可能性,这是一个坏主意吗?
-
您可以通过将套接字创建时间戳存储在套接字上来减少这种可能性,然后定期循环打开的套接字并关闭已打开超过 x 毫秒的套接字,从而避免 1000 次 setTimeouts。但是,我不知道这样会不会更好。
标签: javascript node.js sockets