zoukankan      html  css  js  c++  java
  • Comet:基于HTTP长连接的“服务器推”技术

    1、基础知识

    HTTP流的概念

    持久HTTP流只是一种是HTTP链接保持打开状态的简单方法,这样大量的HTTP请求不需要进行打开和关闭操作就可以被一个一个地发送。

    常用PHP函数

    sleep(10);  //暂停 10 秒 
    ob_flush();
    flush();    
    

    PHP向浏览器周期性发送数据的功能,并不是所有服务器都可行,更多相关信息请参阅www.php.net/flush。关于flush的内容,请参考深入理解ob_flush和flush的区别

    <script>标签的执行时间

    在绝大多数浏览器中,当还没有读取到</script>结束标签时,代码是不会执行的。

    配置脚本最大执行时间

    在Comet执行时,经常超过了php脚本的最大执行时间,因此需要配置maxexecutiontime(详细参考:PHP - PHP.ini配置中文解释),并结合心跳机制。

    var iTimer;
    function heartbeat() {
        clearTimeout(iTimer);
        iTimer = setTimeout(function(){
            // 执行一次Comet
            // 300为服务器端配置的max_execution_time
        }, 300);    
    }
    

    2、Comet的实现方法

    IE浏览器

    demo.html

    <script type="text/javascript">
        var oPage = new ActiveXObject("htmlfile");
        oPage.open();
        oPage.write("<html><body></body></html>");
        oPage.close();
        oPage.body.innerHTML = '<iframe src="connection.php"></iframe>';        
        oPage.parentWindow._parent = self;
    
        function heartbeat() {}
        function modifiedAt() {}
    </script>
    
    • oPage.parentWindow访问的是HTMLFile对象的window属性
    • connection.php中JS使用top或parent访问的不是demo.html的window属性
    • connection.php中JS使用top或parent访问HTMLFile对象的window属性

    connection.php

    <html>
    <head></head>
    <body>
    <script type="text/javascript">
        parent._parent.heartbeat();
        parent._parent.modifiedAt();
    </script>
    </body>
    </html>
    

    其他浏览器

    demo.html

    var oXHR = new XMLHttpRequest();
    oXHR.open('get', 'connection.php', true);
    oXHR.readystatechange = function() {
        switch (oXHR.readyState) {
            case 3:
                alert(oXHR.responseText);
                break;
            case 4:
                alert('done');
        }
    };
    
    • 每次从服务器收到数据时(即服务器端调用“ob_flush(); flush();”时),都会触发readyStatechange事件。
    • readyState等于3时,oXHR.responseText返回的内容,不是本次变化新增的内容,而是之前接受到的内容+本次变化新增的内容。

    3、LiveConnect的HTTP流

    LiveConnect是Firefox、Safari和Opera支持的一种未充分利用的技术,通过它可以再JavaScript种使用Java对象,但客户机必须安装JRE,并且浏览器必须启用Java。

    4、服务器端发送的Dom事件

    示例

    demo.html

    <body>
        <event-source id="iBox" src="connection.php" />
        <script type="text/javascript">
            var iBox = document.getElementById('iBox');
            iBox.addEventListener('modified', function(oEvent){
                console.log(oEvent);
            });
        </script>
    </body>
    

    connection.php

    <?php
        header("Content-type:application/x-dom-event-stream");
        while (true) {
            echo 'Event: modified';
            echo 'data: 5:23:06';       
            ob_flush();
            flush();
            sleep(1);
        }
    ?>
    
    • 使用的就是一个保持打开的链接
    • Event后面是事件名称,其余的是event对象的属性;每两个事件之间使用一个空白换行区分。
    • Target后面紧跟触发的元素,格式类似于CSS选择器。 * 疑问之处,服务器端事件处理函数会不会触发浏览器的默认事件,即想<input type="submit"/>发送click事件,会不会提交表单,还是仅调用该元素的click绑定函数?
    • 服务器端发送的Dom事件可以触发自定义事件,上例中的”modified”事件就是自定义事件。还可以触发客户端的UI事件,Dom Level 3事件规范中命名的所有事件都能够通过服务器端的Dom事件来触发。
    • 不一定要为元素绑定事件处理函数,每个事件都将自动传给目标元素,并由钙元素的事件处理函数负责处理,如下例。

    返回内容

    Event: click
    Target: #iBox
    button: 2
    screenX: 0
    screenY: 0
    Event: click
    Target: Document
    data: See you later!
    

    支持性

    到2006年10月为止,Opera9.0.1是唯一支持服务器端发送的Dom事件的浏览器,经测试Opera 11.52不支持。

    5、连接管理

    HTTP1.1协议中规定,一个客户端最多允许同时保持两个连接(这点取决于浏览器,迅雷等下载工具也会提高这个并发的数目)。使用Comet的后果就是会占用一个连接,具体的解决办法是为Comet指定专门的子域名。

    Comet也会增加服务器的并发数目,所以在使用Comet技术之前要与维护服务器的人员交流,确保他们理解所要实现的功能,并给与支持。

    Comet技术早在2007年左右就有人提出,最早的一篇文章是What else is burried down in the depth’s of Google’s amazing JavaScript?,至今仍未大面积使用。主要原因还在于它对服务器的开销和开发模式上的改变,另一方面使用Ajax绝大多数情况下可以很好的替代Comet。

  • 相关阅读:
    jquery拖拽排序,针对后台列表table进行拖拽排序(超实用!)
    python笔记34-类里面的__str__ 和__unicode__作用
    python测试开发django-16.JsonResponse返回中文编码问题
    python测试开发django-15.查询结果转json(serializers)
    python测试开发django-14.ORM查询表结果(超详细)
    python测试开发django-13.ORM操作数据库(增删改查)
    python测试开发django-12.models设置主键primary_key
    python笔记33-python3连mysql增删改查
    Linux学习19-gitlab配置邮箱postfix(新用户激活邮件)
    K均值与C均值区别
  • 原文地址:https://www.cnblogs.com/rainman/p/2266193.html
Copyright © 2011-2022 走看看