-
PHP+Ajax实现在线聊天长轮询 评分:
HTTP是无状态、单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应。通过长轮询,你可轻松实现在线聊天功能。
HTML
首先我们放置一个获取数据按钮和数据存放地方#msg。
<div id="msg"></div> <input id="btn" type="button" class='btn' value="获取数据" />
jQuery
我们向ajax.php请求,请求的时间设置80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接状态,直到有数据返回或‘success’的值为0才关闭连接。在关闭连接后在继续下一次的请求。
$(function() { $("#btn").bind("click", { btn: $("#btn") }, function(evdata) { $.ajax({ type: "POST", dataType: "json", url: "ajax.php", timeout: 80000,//ajax请求超时时间80秒 data: { time: "80" }, //40秒后无论结果服务器都返回数据 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(); } }, //Ajax请求超时,继续查询 error: function(XMLHttpRequest, textStatus, errorThrown) { if (textStatus == "timeout") { $("#msg").append("<br>[超时]"); evdata.data.btn.click(); } } }); });
Ajax.php
通过$_POST['time']来限制循环的超时时间,避免资源过度浪费。要注意的是浏览器不关闭的话,会一直请求下去......
if(empty($_POST['time']))exit(); set_time_limit(0);//无限请求超时时间 $i=0; while (true){ //sleep(1); usleep(500000);//0.5秒 $i++; //若得到数据则马上返回数据给客服端,并结束本次请求 $rand=rand(1,999); if($rand<=15){ $arr=array('success'=>"1",'name'=>'xiaocai','text'=>$rand); echo json_encode($arr); exit(); } //服务器($_POST['time']*0.5)秒后告诉客服端无数据 if($i==$_POST['time']){ $arr=array('success'=>"0",'name'=>'xiaocai','text'=>$rand); echo json_encode($arr); exit(); } }
大家可以利用这种长轮询(COMET)方式,做一个在线聊天系统,若是成功的话,你肯定会觉得小有成就呢!~
2020-02-06 上传
- holy荷勒
这个人很懒,什么都没留下。
热门资源
-
thinkphp3.2加好友聊天源码
2020-02-07 营子 -
域名url转发
2020-02-07 营子 -
php+Ajax远程加载避免重复提交
2020-02-07 飘飘哥 -
Thinkphp+Ajax登录注册
2020-02-07 金棕榈 -
php+Ajax无刷新分页
2020-02-07 -
redis session共享类,拿着直接用(负载均衡)
2020-02-07 xmcyad -
thinkphp5开发restful API接口自动生成文档
2020-02-07 lgwish -
PHP整蛊二维码生成器
2020-02-07 7057119 -
上传头像带裁剪预览功能Flash版带在线拍照
2020-02-07 250250 -
PHP检测上传图片是否有木马
2020-02-07 -
QQ钱包扫码支付源码
2020-02-06 飘飘哥 -
Thinkphp整合webupload多图片上传
2020-02-06 7057119