用jquery和php实现AJAX LongPoll
HTTP是无状态、单向的协议,用户只能通过客服终端向服务器发送请求,服务器处理并发回响应。要实现聊天室、WEBQQ、在线客服、邮件等即时通讯应用,需要使用“Comet”。
在传统的AJAX轮询模式下,客户服务端以用户定义的时间间隔查询服务器上的最新数据。这种拉数据的方式需要很短的时间间隔来保证数据的准确性,但是如果时间间隔太短,客服会在短时间内向服务器发送多个请求。
反转AJAX被称为长轮询或COMET。服务器和客户服务端需要保留一个长请求,这使得服务器在有数据时可以向客户端返回消息。
可扩展的超文本标记语言
Div id=' msg'/div输入id=' BTN '类型=' button '值=' test'/jQuery。
这里,使用AJAX请求data.php页面获取“成功”的值,请求时间达到80秒。在这80秒内,如果服务器没有返回“成功”,连接状态将一直保持,直到返回数据或“成功”的值为0。关闭连接后继续下一个请求。
$(function(){ $('#btn '))。bind('click ',{btn:$('#btn')},function(evdata){ $。ajax({ type:'POST ',dataType:'json ',url:'data.php ',Timeout:80000,//ajax请求超时为80秒,data:{time:'80'},//40'},//40秒后,服务器将返回数据而不管结果如何。Success 3360函数(数据、文本状态){//从服务器获取数据。显示数据并继续查询if(数据。success==' 1') {$ ('# msg ')。追加(' br[data]' data . text);evdata . data . BTN . click();}//没有来自服务器的数据,继续查询if(数据。success==' 0') {$ ('# msg ')。追加(' br[无数据]');evdata . data . BTN . click();} },//Ajax请求超时,继续查询error:函数(xmlhttprequest,textstatus,error through){ if(text status==' time out '){ $(' # msg ')。追加(' br[time out]');evdata . data . BTN . click();} } });});});服务器端编程语言(Professional Hypertext Preprocessor的缩写)
这里是一个无限循环,循环的结束条件是得到返回结果并返回Json数据。
并接受$_POST['time']参数来限制循环的超时,避免资源的过度浪费。(浏览器关闭时,不会向服务器发送消息,使用可能会持续循环。)
if(emptyempty($ _ POST[' time ']))exit();set _ time _ limit(0);//无限请求超时$ I=0;while(true){//sleep(1);us LEEP(500000);//0.5秒$ I;//如果得到数据,立即返回给客服端,结束本次请求$rand=rand(1,999);if($ rand=15){ $ arr=array(' success '=' 1 ',' name'='蔡晓',' text '=$ rand);echo JSON _ encode($ arr);exit();}//服务器($_POST['time']*0.5)秒后告诉客服没有数据if($ I==$ _ POST[' time ']){ $ arr=array(' success '=' 0 ',' name'='萧艾',' text '。echo JSON _ encode($ arr);exit();}} Running Effect :从图中可以看出,没有数据的请求时间已经达到40S,如果在40S内获得数据,则关闭请求。
版权声明:用jquery和php实现AJAX LongPoll是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。