使用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);
骚年,来都来了,发下言呗。

浙公网安备 33010602011771号