美文网首页
(一)数据推送之comet

(一)数据推送之comet

作者: mkv_me | 来源:发表于2017-12-11 10:19 被阅读0次

介绍

之前参与项目里,见到过有人用ajax长轮询来做实时数据推送。但是这样做有一个弊端就是会建立很多TCP连接,这样会给系统带来比较大的IO负担。

有没有一种方式,我们只进行一次TCP连接,在这一次TCP连接中,服务器不断给客户端吐数据。下面我们就来介绍一下comet推送方式:

comet推送方式

我们用php来做服务端

<?php
    header("Content-type:appliacation/json;charset=utf-8");
    header("Cache-Control:max-age=0");  // 让前端接收没有缓冲,因为我们要实时获取数据
    
    // 我们用一种方式,让它连上之后不释放
    $i=0;
    while($i<9){
        $i++;
        $radom = rand(1,999);
        sleep(1);
        echo $radom;
        echo "<br>";
        ob_flush(); // 把当前资源释放掉
        flush();    // 拿到释放掉的资源,吐浏览器
        // 一直让它输出,而且是一个流式输出
    }
?>

js怎样捕捉一直在发送阶段

<script>
    var getXmlHttpRequest = function(){
        if(window.XMLHttpRequest){
            return new XMLHttpRequest();
        }
        else if(window.ActiveXObject){
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    var xhr = getXmlHttpRequest();
    xhr.onreadystatechange = function (){
        console.log(xhr.readyState);
        // 检测readyState为3的时候,我们就能把responseText输出出来
        // 而且每次一都能把上次全部内容都打印出来
        if(xhr.readyState ===3 &&xhr.status === 200){
            console.log(xhr.responseText);
        }
    }
    xhr.open("get","data.php",true);
    xhr.send("");
</script>

那我们能不能用普通的ajax来实现呢,也是可以的

js用普通ajax去请求

<script>
    function conn(){
        $.ajax({
            url: 'data.php',
            dataType: 'json',
            success: function(data){
                console.log(data);
                conn();
            }
        })
    }
    conn();
</script>

服务端我们不去断掉连接

<?php
    header("Content-type:appliacation/json;charset=utf-8");
    header("Cache-Control:max-age=0");
    sleep(1);
    $res = array('success'=>'ok','test'=>'我是测试文本');
    echo json_encode($res); 
?>

或者我们用下面这种方式,用一个while循环,我们可以通过前端给来的参数去判断执行过少次。

<?php
    header("Content-type:appliacation/json;charset=utf-8");
    header("Cache-Control:max-age=0");
    while(true){
        sleep(1);
        $res = array('success'=>'ok','test'=>'我是测试文本');
        echo json_encode($res); 
        exit(); // 切记要退出,不然前端拿不到数据
    }
?>

因为只要不断掉,我们再去请求还是连接的上一次请求,只不过这是用前端实现了轮询效果,刚才我们用后端flush()来实现的这件事

相关文章

  • (一)数据推送之comet

    介绍 之前参与项目里,见到过有人用ajax长轮询来做实时数据推送。但是这样做有一个弊端就是会建立很多TCP连接,这...

  • comet4j

    初步学习可以看看java web 服务器推送技术--comet4jComet HTTP服务器推送框架之Comet4...

  • 服务器端推送技术

    服务器端推送技术 介绍服务器向浏览器推送数据的技术,包括:meta标签刷新页面、Ajax轮询、Comet、WebS...

  • Comet与SpringMVC的集成-java后端消息推送

    使用Comet为了实现java后台给前台页面推送消息通知 准备 web项目中引入comet4j.js文件和come...

  • JavaScript数据推送

    1.Comet:基于HTTP长链接的服务器推送技术 服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端...

  • JavaScript 数据推送:《Comet:基于HTTP长连接

    Comet 是什么? Comet 是一种Http 长连接技术,像服务器器发送一个请求,服务器不释放资源,不停的向前...

  • 消息推送Web端组件

    这里使用基于HTTP长链接推送技术 --Comet 实现方式 基于 AJAX 的长轮询(long-polli...

  • long polling 实现B/S架构的实时消息推送

    comet 4j 实现消息推送 整体方案: PS:该方案的消息推送速度基本和socket相差无疑,至于和借助于ra...

  • HTTP性能与服务器推送

    SPDY是什么WebSocket是什么HTTP2.0服务器推送方法,短轮询、长轮询(comet)是什么 HTTP的...

  • 0821A

    socket 代替以前的comet技术或HTTP轮询的实现实时消息推送的技术集成在nodejs中的net模块里示例...

网友评论

      本文标题:(一)数据推送之comet

      本文链接:https://www.haomeiwen.com/subject/pqtiixtx.html