簡單描述: 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),待服務器響應