php javascript comet

簡單描述: javascript

comet是用ajax實現的服務器推送,有兩種實現comet的方式,長輪詢和流,這裏只實現長輪詢。 php

長輪詢的過程:頁面發起一個服務器請求,而後服務器一直保持鏈接打開,直到有數據返回。返回數據以後瀏覽器關閉鏈接,隨即又發起另外一個服務器請求。這一過程在頁面打開期間一直保持接二連三。 css

這種方式節省帶寬,而且遞歸請求(有順序),跟普通輪詢無序相比好不少。 html

testPush.html,內容以下 java

簡單描述: jquery

comet是用ajax實現的服務器推送,有兩種實現comet的方式,長輪詢和流,這裏只實現長輪詢。 ajax

長輪詢的過程:頁面發起一個服務器請求,而後服務器一直保持鏈接打開,直到有數據返回。返回數據以後瀏覽器關閉鏈接,隨即又發起另外一個服務器請求。這一過程在頁面打開期間一直保持接二連三。 瀏覽器

這種方式節省帶寬,而且遞歸請求(有順序),跟普通輪詢無序相比好不少。 服務器

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),待服務器響應

相關文章
相關標籤/搜索