• php javascript comet


    简单描述:

    comet是用ajax实现的服务器推送,有两种实现comet的方式,长轮询和流,这里只实现长轮询。

    长轮询的过程:页面发起一个服务器请求,然后服务器一直保持连接打开,直到有数据返回。返回数据之后浏览器关闭连接,随即又发起另一个服务器请求。这一过程在页面打开期间一直保持连续不断。

    这种方式节省带宽,并且递归请求(有顺序),跟普通轮询无序相比好很多。

    testPush.html,内容如下

    简单描述:

    comet是用ajax实现的服务器推送,有两种实现comet的方式,长轮询和流,这里只实现长轮询。

    长轮询的过程:页面发起一个服务器请求,然后服务器一直保持连接打开,直到有数据返回。返回数据之后浏览器关闭连接,随即又发起另一个服务器请求。这一过程在页面打开期间一直保持连续不断。

    这种方式节省带宽,并且递归请求(有顺序),跟普通轮询无序相比好很多。

    testPush.html,内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <html>
        <head>
            <meta http-equiv="pragma" content="no-cache">
            <meta http-equiv="cache-control" content="no-cache">
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <script type="text/javascript" src="jquery.min.js"></script>      
            <script type="text/javascript">
                $(function () {
                    (function longPolling() {
                        alert(Date.parse(new Date())/1000);
                        $.ajax({
                            url: "testPush1111.php",
                            data: {"timed": Date.parse(new Date())/1000},
                            dataType: "text",
                            timeout: 5000,//5秒超时,可自定义设置
                            error: function (XMLHttpRequest, textStatus, errorThrown) {
                                $("#state").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>");
                                if (textStatus == "timeout") { // 请求超时
                                    longPolling(); // 递归调用
                                } else { // 其他错误,如网络错误等
                                    longPolling();
                                }
                            },
                            success: function (data, textStatus) {
                                $("#state").append("[state: " + textStatus + ", data: { " + data + "} ]<br/>");
                                 
                                if (textStatus == "success") { // 请求成功
                                    longPolling();
                                }
                            }
                        });
     
                    })();
                });
            </script>
        </head>
        <body>
            <div id="state"></div>
        </body>
    </html>

    testPush.php,内容如下

     

    测试分析

    会有几种情况:

    1.成功返回,状态码200,然后再次发起长连接

    2.超时,取消(canceled)这次长连接,然后再次发起长连接

    3.长连接等待中(pending),待服务器响应

    testPush.php,内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    if(!$_GET['timed']) exit();
    date_default_timezone_set("PRC");
    set_time_limit(0);//无限请求超时时间
    $timed = $_GET['timed'];
    while (true) {
        sleep(3); // 休眠3秒,模拟处理业务等
        $i = rand(0,100); // 产生一个0-100之间的随机数
        if ($i > 20 && $i < 56) { // 如果随机数在20-56之间就视为有效数据,模拟数据发生变化
            $responseTime = time();
            // 返回数据信息,请求时间、返回数据时间、耗时
            echo ("result: " . $i . ", response time: " . $responseTime . ", request time: " . $timed . ", use time: " . ($responseTime - $timed));
            exit();
        } else { // 模拟没有数据变化,将休眠 hold住连接
            sleep(13);
            exit();
        }
    }

    测试分析

    会有几种情况:

    1.成功返回,状态码200,然后再次发起长连接

    2.超时,取消(canceled)这次长连接,然后再次发起长连接

    3.长连接等待中(pending),待服务器响应

  • 相关阅读:
    一周小记(十七)
    一周小记(十九)
    2021/12/28组会
    AdaIN论文阅读(Arbitrary Style Transfer in Realtime with Adaptive Instance Normalization)
    PostgreSQL新增、更新、删除触发器
    leetcodedphard最小距离
    leetcodedp编辑距离问题两个字符串的删除操作
    正向代理代理客服端,反向代理代理服务器
    mybatisplus逻辑删除 3.1一下版本
    Eclipse使用指定JDK,无需配置Path变量
  • 原文地址:https://www.cnblogs.com/foxhengxing/p/6605417.html
Copyright © 2020-2023  润新知