zoukankan      html  css  js  c++  java
  • COMET技术具体实现 结合PHP和JQUERY

    具体看代码,费话不说

    PHP服务端

    $mem = new RTMEM();
    if(!$mem->conn())
      exit('no mem server');
    if(!$mem->getstate())
      exit('moonjksrv is not runing');
    $alminfo = $mem->get('alm_info');
    if(!$alminfo)
      exit('no alarm');
    $almobj = json_decode($alminfo);
    if(!$almobj)
      exit('no json data');
    $lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
    $currentmodif = $almobj->timestamp;
    while ($currentmodif <= $lastmodif) // check if the data file has been modified
    {
      usleep(1000000); // sleep 1 second to unload the CPU
      clearstatcache();
      $alminfo = $mem->get('alm_info');
      if(!$alminfo)
        exit('no alarm');
      $almobj = json_decode($alminfo);
      if(!$almobj)
        exit('no json data');
      $currentmodif = $almobj->timestamp;
    }
    
    exit(json_encode($almobj));

    以下是JS端

    //comet ajax////
    var Comet = function(options){
        this.init(options);
    };
    Comet.prototype = {
        constructor: Comet,
        init:function(options){
            this.options = {
                url:"",
                callback:function(){}
            }
            this.options = $.extend(this.options,options||{});
            this.url = this.options.url;
            this.callback = this.options.callback;
            this.timestamp = 0;
            this.noerror = true;
            this.lock = true;
        },
        connect: function(){
            this.lock = false;
            this.ajaxLoop();
        },
          disconnect: function(){
            this.lock = true;
        },
        ajaxLoop: function(){
            if(this.url && !this.lock){
                var _this = this;
                $.ajax({
                    url:_this.url,
                    type:'get',
                    data:'timestamp=' + _this.timestamp,
                    dataType:'json',
                    cache:false,
                    success:function(json){
                        _this.timestamp = json['timestamp'];
                        _this.handleResponse(json);
                        _this.noerror = true;
                    },
                    complete:function(){
                        if (_this.noerror){
                            _this.ajaxLoop();
                        }else{
                            // if a connection problem occurs, try to reconnect each 1 seconds
                            setTimeout(function(){_this.ajaxLoop()}, 1000); 
                        }
                        _this.noerror = false;
                    }
                })
            }
        },
          handleResponse: function(response){
            this.callback(response);
          },
        doRequest: function(request){
            if(this.url && !this.lock){
                $.get(this.url, { 'msg': request } ); 
            }
        }
    }
    ///////
    
    
        var comet = new Comet({
            url:'binsrv/rt_alm.php?type=getrtalm',
            callback:function(json){ //接收到数据的处理
                if(typeof(page)!="undefined" && typeof(page.processAlmData)=="function")
                    page.processAlmData(json);
                        }
                }); 
                comet.connect();    

    这样的话,服务器查询数据有更新才会返回AJAX请求,没有更新会直到超时(PHP默认30秒超时),这时COMET会重新连接

    这样大大降低了频繁的AJAX请求,又没有降低实时性。

  • 相关阅读:
    umeng社交分享最新版5.0的跨进程使用崩溃的问题及解法-Android
    AlertDialog禁止返回键
    一个男人想经商,不读 100本商人自传,怎么会了解商人的思维状态
    Android中使用Gson解析JSON数据的两种方法
    DevExpress gridControl控件动态绑定列 zt
    获得WCF Client端的本地端口 z
    log4net.dll配置以及在项目中应用 zt
    系统交易策略 hylt
    判斷作業系統為 64bit 或 32bit z
    路徑 z
  • 原文地址:https://www.cnblogs.com/elonlee/p/3850902.html
Copyright © 2011-2022 走看看