我正在运行一个节点并将服务器与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"}));
}
};