HTTP是无状态、单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应。若要实现聊天室、WEBQQ、在线客服、邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术(Comet)”。
传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。
反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。
html:
url:
"data.php"
,
timeout:80000,
data:{time:
"80"
},
success:
function
(data,textStatus){
if
(data.success==
"1"
){
$(
"#msg"
).append(
"<br>[有数据]"
+data.text);
evdata.data.btn.click();
if
(data.success==
"0"
){
$(
"#msg"
).append(
"<br>[无数据]"
);
evdata.data.btn.click();
error:
function
(XMLHttpRequest,textStatus,errorThrown){
if
(textStatus==
"timeout"
){
$(
"#msg"
).append(
"<br>[超时]"
);
evdata.data.btn.click();
在这里是无限的循环,循环的结束条件就是获取到了返回结果返回Json数据。
并且接受$_POST['time']参数来限制循环的超时时间,避免资源的过度浪费。(浏览器关闭不会发消息给服务器,使用可能一直循环下去)
if
(
empty
(
$_POST
[
'time'
]))
exit
();
set_time_limit(0);
$i
=0;
while
(true){
usleep(500000);
$i
++;
$rand
=rand(1,999);
if
(
$rand
<=15){
$arr
=
array
(
'success'
=>
"1"
,
'name'
=>
'xiaocai'
,
'text'
=>
$rand
);
echo
json_encode(
$arr
);
exit
();
if
(
$i
==
$_POST
[
'time'
]){
$arr
=
array
(
'success'
=>
"0"
,
'name'
=>
'xiaocai'
,
'text'
=>
$rand
);
echo
json_encode(
$arr
);
exit
();