使用node.js实现长轮循

公司app需要获取服务器的实时数据,又不想用socket来实现。经查询,发现长轮循似乎是个好办法。于是乎,用.net实现了一下,上线后发现那个卡啊......IIS的工作线程比较小,而长轮循要hold住连接,每一个请求都得占用一个工作线程,

客户端稍微多点,IIS就压力山大了。没办法只能去学下node.js了,废话不多说,直接上代码吧。

var http = require('http');

var clients = [];
var hostname = 'www.baidu.com';
var port = 80;
var options = {
    hostname: hostname,
    port: port,
    path: '/polling',
    method: 'get'
};

var lastTime = new Date().getTime() + Math.abs(new Date().getTimezoneOffset() * 60000); // 最后一次获取数据的时间 需要加上本地时间和标准时间差距的8小时

http.createServer(function (req, res) {var o = { response: res, time: (new Date().getTime()) };

    clients.push(o);

    console.log('收到一个新的请求,当前请求总数:'+clients.length);
}).listen(1337, '127.0.0.1');

console.log('server is running at ' + '127.0.0.1:1337');

setInterval(function () {
    options.path = '/polling' + "?lastTime=" + lastTime; // 重新给参数赋值
    console.log('lastTime:'+lastTime);
    var req = http.request(options, function (res) {

        console.log("当前请求总数:" + clients.length);

        res.on('data', function (msg) { // json格式:{ "IsHaveMsg":"0","Msg":"data" }
            console.log("msg:" + msg);
            var m = JSON.parse(msg);
            if (m.responseCode == "0") { // 服务器正确返回
                lastTime = new Date().getTime() + Math.abs(new Date().getTimezoneOffset() * 60000);
                console.log(m.IsHaveMsg == "1" ? "有新数据:" + m.Msg : '没有新数据');

                if (m.IsHaveMsg == "1") {
                    while (clients.length > 0) {
                        var client = clients.shift(); // 删除并返回第一个元素
                        client.response.writeHeader(200, { 'Content-Type': 'application/json;charset=UTF-8' });
                        client.response.end(JSON.stringify(m));
                        console.log(JSON.stringify(m));
                    }
                }
            }

            var i = clients.length - 1;
            var now = new Date().getTime();
            console.log("当前时间:" + now);
            // 检查超时
            while (i >= 0) {
                console.log("这个请求的时间:" + clients[i].time);
                if (clients[i].time + 55000 < now) {
                    clients[i].response.writeHeader(200, { 'Content-Type': 'application/json;charset=UTF-8' });
                    clients[i].response.end(JSON.stringify(m));
                    clients.splice(i, 1); // 删除
                    console.log('有请求超时了');
                }
                i--;
            }
        });

        console.log('\n');
    });

    req.on('error', function (e) {
        console.log("获取最新数据的时候出错,错误信息:"+e.message);
    });

    req.end();

}, 7000);

 

 骚年,来都来了,发下言呗。

posted @ 2016-01-28 13:47  chenhp  阅读(247)  评论(0)    收藏  举报