setInterval和setTimeout自动停止

时间:2017-06-09 13:12:12

标签: javascript node.js express websocket

我正在运行一个节点并将服务器与WS(WebSocket)一起表达。 我正在维护连接用户(ws客户端)映射,并不断以固定的间隔向连接的客户端发送一些消息。

所有这些工作都很好,期望setInterval和setTimout.Don的意外行为甚至知道为什么会发生这种情况。早先我使用了setInterval,然后我切换到递归setTimeout但是同样的事情发生了。节点继续运行并接受与WebSocket相同的端口和相同端点上的HTTP请求,但用于检查已连接客户端的调度程序停止。

为什么会发生这种情况,我怎样才能让它不停地工作。

代码:

   setTimeout(function run() {
    // call function to execute
    schedulerOP();
    setTimeout(run, schedulerInterval);
}, schedulerInterval);

function schedulerOP(){
    var connectionMap = connectionHandler.getConnectionMap();
    logger.info("No. of connected clients :  "+ Object.keys(connectionMap).length);

    for(var key in connectionMap){
        if((!connectionMap[key].hasOwnProperty('pingtime') && (new Date().getTime() - connectionMap[key]['pongtime'] <= pingpongLifetime)) ||
            (connectionMap[key].hasOwnProperty('pingtime') && (Math.abs(connectionMap[key]['pingtime'] - connectionMap[key]['pongtime']) <= pingpongLifetime))){

            //send ping to client
            connectionMap[key]['pingtime'] = new Date().getTime();
            sendMessageToClient(key,connectionMap[key]['ws'],JSON.stringify({message:'ping'}));

        }else{
            closeSocketAndRemoveClientFromMap(key,'Ping Pong time exceeded')
        }
    }
}


connectionMap : 
{ 'clientip:clientport' : {'username':'*username*','password':'*password*','udid':'*deviceidentifier','pingtime':'last time when server send msg to client','pongtime':'last time when client send message to server'}

客户代码:

客户端打开ws连接后,会发送

ws.send(JSON.stringify({username: "username", password: "password", udid: "dummyudid"}));

这是客户收到消息的时候:

ws.onmessage = function incoming(evt) {
                    console.log("data from server == " ,evt.data);
                    if(response.message == 'ping') {
                       // console.log("sending message to ws")
                        ws.send(JSON.stringify({username: "username", password: "password", udid: "dummyudid"}));
                    }
                };

0 个答案:

没有答案