Comet 反Ajax: jQuery與PHP實現Ajax長輪詢

原文地址(http://justcode.ikeepstudying.com/2016/08/comet-%E5%8F%8Dajax-%E5%9F%BA%E4%BA%8Ejquery%E4%B8%8Ephp%E5%AE%9E%E7%8E%B0ajax%E9%95%BF%E8%BD%AE%E8%AF%A2longpoll/)javascript

頁面代碼:php

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>jQuery與PHP實現Ajax長輪詢</title>
    <script src="http://sources.ikeepstudying.com/js/jquery-1.11.3.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#btn").bind("click",{btn:$("#btn")},function(evdata){   
                $.ajax({   
                    type:"POST",   
                    dataType:"json",   
                    url:"./comet.php",   
                    timeout:10000,     //ajax請求超時時間10秒   
                    data:{time:"6"}, //6秒後不管結果服務器都返回數據   
                    success:function(data,textStatus){
                        console.log(evdata);
                        //從服務器獲得數據,顯示數據並繼續查詢     
                        if(data.success=="1"){     
                         $("#msg").append("<br>[有數據]"+data.text);     
                         evdata.data.btn.click();
                        }     
                     //未從服務器獲得數據,繼續查詢     
                        if(data.success=="0"){     
                        $("#msg").append("<br>[無數據]");     
                        evdata.data.btn.click();
                        }
                    },
                     //Ajax請求超時,繼續查詢
                     error:function(XMLHttpRequest,textStatus,errorThrown){
                         console.log(textStatus);
                        if(textStatus=="parsererror"){
                            $("#msg").append("<br>[超時]");
                            evdata.data.btn.click();
                        }
                     }
                    });
            });
        });
    </script>
</head>
<body>
    <div id="msg"></div>
    <input id="btn" type="button" value="測試" />
</body>
</html>

php代碼:html

<?php
if(empty($_POST['time'])) exit();     
set_time_limit(0);//無限請求超時時間     
$i=0;     
while (true)
{     
    //sleep(1);     
    usleep(500000);//0.5秒     
    $i++;     
           
    //若獲得數據則立刻返回數據給客服端,並結束本次請求     
    $rand=rand(1,999);     
    if($rand<=100){     
        $arr=array('success'=>"1",'name'=>'xiaocai','text'=>$rand);     
        echo json_encode($arr);     
        exit();     
    }     
           
    //服務器($_POST['time']*0.5)秒後告訴客服端無數據     
    if($i==$_POST['time']){     
        $arr=array('success'=>"0",'name'=>'xiaocai','text'=>$rand);     
        echo json_encode($arr);     
        exit();     
    }     
}

?>

下面是測試結果:java

  

 下面推薦幾篇寫的很好的文章,關於輪詢和鏈接的:jquery

  http://web.jobbole.com/85541/  (談談HTTP協議中的短輪詢、長輪詢、長鏈接和短鏈接)web

  http://www.cnblogs.com/hoojo/p/longPolling_comet_jquery_iframe_ajax.html  (內容:web通訊之長鏈接、長輪詢)ajax

  http://blog.zhangruipeng.me/2015/10/22/Web-Connectivity/  (內容:傳統輪詢、長輪詢、服務器推送事件和WebSocket)json

相關文章
相關標籤/搜索