我具有服务器端功能来检查播放器是否空闲
socket.idle = 0;
socket.cached = {};
socket.checkIdle = function(){
socket.idle++;
console.log(socket.idle);
if(socket.cached.x != players[id].x || socket.cached.y != players[id].y){
socket.idle=0;
}
socket.cached = players[id];
if(socket.idle>12){
socket.disconnect();
}
}
socket.interval = setInterval(socket.checkIdle,1000);
我注意到,即使播放器启动/断开连接的时间过长。服务器仍在控制台为它记录socket.idle。
我会以错误的方式处理吗?然后我还应该清除播放器断开连接的时间间隔吗?
socket.on('disconnect', function(){
clearInterval(socket.interval);
});
答案 0 :(得分:0)
您当然不应该让setInterval()
在不再连接的播放器上运行。您的服务器将越来越多地运行这些服务器,浪费CPU周期,并可能影响服务器的响应能力或可伸缩性。
我注意到,即使播放器启动/断开连接的时间过长。服务器仍在控制台为它记录socket.idle。
是的,这是因为该间隔仍在运行,并且实际上,它甚至可以防止套接字对象被垃圾回收。所有这些都是不好的。
然后我还应该清除播放器断开连接的时间间隔吗?
是的,当套接字断开连接时,必须清除与该套接字关联的间隔计时器。
我会以错误的方式处理吗?
如果您保持每个单独套接字的轮询间隔计时器的体系结构,那么这是在套接字断开连接时清除计时器的正确方法。
但是,我认为也许您可以提出另一种设计,而该设计根本不需要定期“轮询”空闲状态。看来您希望有12秒的超时时间,以便如果播放器在12秒内没有移动,那么您将断开用户连接。真的没有理由每秒检查一次。从用户连接起,您只需在setTimeout()
中设置一个计时器,持续12秒钟,然后每次您收到播放器移动的通知(由于必须在{{1 }}和players[id].x
),您只需清除旧计时器并设置一个新计时器即可。计时器启动后,您必须走了12秒钟才保持静止,然后才能断开连接。这通常是超时类型计时器的工作方式。