javascript轮询请求服务器
抛出问题:web浏览器如何与服务保持通信?
方法一:Ajax轮询
方法二:EventSource轮询
方法三:websocket保持长连接
下面的解决方案是,Ajax轮询与EventSource轮询的合体。
客户端代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="jquery.min.js"></script>
<script src="PollSource.js"></script>
</head>
<body>
<h1>Server Data:</h1>
<div id="serverData"></div>
<a href="javascript:Poll.open(1000);">open poll</a>
<a href="javascript:Poll.close();">close poll</a>
<script type="text/javascript">
var serverData,Poll;
var SERVER_URL = "index.php";
window.onload = function(){
serverData = document.getElementById("serverData");
Poll = new PollSource(SERVER_URL);
Poll.onmessage = function(json) {
//console.log(json);
serverData.innerHTML = json.data;
}
}
</script>
</body>
</html>
PollSource.js代码:
/**
* PollSource javascript轮询服务器
* @param string url 服务器地址 例:www.example.com/index.php
* @param json jsonParam 传递给服务器的参数
* @author Echo
*/
function PollSource(url,jsonParam) {
this.url = url;
this.onmessage = null;
this.resource = null;
this.PollType = typeof(EventSource)=='undefined' ? 'AjaxGet' : 'EventSource';
//将轮询类型传递给服务器,以便服务器作出响应
if(typeof jsonParam == 'object') {
jsonParam['PollType'] = this.PollType;
}else{
jsonParam = {PollType:this.PollType};
}
this.url += '?';
for(var i in jsonParam) {
this.url += i+'='+jsonParam[i]+'&';
}
this.url = this.url.substring(0,(this.url.length-1));
/**
* 开始轮询
*/
this.open = function() {
var onmessage = this.onmessage;
var url = this.url;
var msg = '连接没有被建立,或者已经关闭,或者发生了某个致命错误'; //错误时不友好提示 :)
if(this.PollType == 'AjaxGet') {
//采用轮询
this.resource = {};
url += '&Seconds=';
var hangUp = false; //是否挂起
var retry = spend = 3000; //最快轮询速度 3 秒一次
this.resource.lockInt = setInterval(function(){
retry -= spend;
//alert(retry);
if(retry > 0 || hangUp) return;
hangUp = true; //挂起
$.get(url+(new Date()).getSeconds(),{},function(data){
try{
var json = JSON.parse(data);
retry = json.retry;
hangUp = false; //取消挂起
if(typeof onmessage == 'function') onmessage(json);
}catch(e){console.log(e);alert(msg);}
});
},spend);
this.resource.close = function() {
if(typeof this.lockInt == 'number') {
clearInterval(this.lockInt);
}
}
}else{
//采用服务器发送事件技术
this.resource = new EventSource(this.url);
this.resource.onmessage = function(e) {
try{
var json = JSON.parse(e.data);
if(typeof onmessage == 'function') onmessage(json);
}catch(e){
console.log(e);alert(msg);
}
}
this.resource.onerror = function(e) {
if(this.readyState == 2) alert(msg);
}
}
}
/**
* 关闭轮询
*/
this.close = function() {
if(this.resource) this.resource.close();
}
}
服务端代码:
<?php
header("Content-type: text/html; charset=utf-8");
date_default_timezone_set("Asia/Shanghai");
$retry = 9000; //AjaxGet 轮询 最快是 3000 所以这里设置的值最好是 3 的倍数 如果不是三的倍数 那么时间误差在1~2秒内
$result = array('code'=>0,'msg'=>'拉取成功','retry'=>$retry,'data'=>'当前时间是:'.date('Y-m-d H:i:s'));
$result = json_encode($result);
$PollType = isset($_GET['PollType']) ? trim($_GET['PollType']) : '';
sleep(3); //延迟 3秒 返回数据 重试时间 9秒 刚好是 客户端12秒一次刷新数据
if($PollType == 'AjaxGet') {
//header('Content-Type:application/json; charset=utf-8');
echo $result;
}else if($PollType == 'EventSource') {
header('Content-Type: text/event-stream');
echo 'data:'.$result."\n\n";
echo 'retry:'.$retry."\n\n"; //EventSource轮询速度 虽然可以设定为 1 秒 一次 但不建议
flush();
}else{
die('error');
}
测试效果:


代码下载:百度网盘
参考资源:
https://developer.mozilla.org/zh-CN/docs/Server-sent_events/EventSource
https://developer.mozilla.org/zh-CN/docs/Server-sent_events/Using_server-sent_events#Event_stream_format
javascript轮询请求服务器的更多相关文章
- Ajax轮询请求
Ajax轮询请求 什么是轮询? 轮询(polling):客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. Ajax轮询需要服务器有很快的处理速度与快速响应. ...
- 常规轮询请求,客户端用Ajax调webservice的方法
服务端发布webservice,下图方框中的一定要有 客户端代码 <script type="text/javascript"> $(document).ready(f ...
- 实现Comet(服务器推送)的两种方式:长轮询和http流
Comet 是一种高级的Ajax技术,实现了服务器向页面实时推送数据的技术,应用场景有体育比赛比分和股票报价等. 实现Comet有两种方式:长轮询与http流 长轮询是短轮询的翻版,短轮询的方式是:页 ...
- 利用ajax短轮询+php与服务器交互制作简易即时聊天网站
主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 本文主要介绍ajax短轮询的简易实现方式. 看懂此文 ...
- ajax短轮询+php与服务器交互制作简易即时聊天网站
主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 本文主要介绍ajax短轮询的简易实现方式. 看懂此文 ...
- Comet 反Ajax: jQuery与PHP实现Ajax长轮询
原文地址(http://justcode.ikeepstudying.com/2016/08/comet-%E5%8F%8Dajax-%E5%9F%BA%E4%BA%8Ejquery%E4%B8%8E ...
- polling轮询和comet
comet:(原意:彗星) Comet is a web application model in which a long-held(held:保留) HTTP request allows a w ...
- .Net MVC 实现长轮询
什么是长轮询? 长轮询是“服务器推”技术实现方式的一种,可以将服务端发生的变化实时传送到客户端而无须客户端频繁的地刷新.发送请求. 长轮询原理? 客户端向服务器发送Ajax请求,服务器接收到请求后,保 ...
- 10分钟学会web通讯的四种方式,短轮询、长轮询(comet)、长连接(SSE)、WebSocket
一般看到标题我们一般会产生下面几个问题??? 什么是短轮询? 什么是长轮询? 长连接又是什么? wensocket怎么实现呢? 他们都能实现web通讯,区别在哪呢,哪个好用呢? 接下来我们就一个个来了 ...
随机推荐
- selenium中元素操作之简单的鼠标、键盘操作(三)
1.鼠标操作导入类:ActionChains --鼠标的操作形成一连串的动作链,由selenium的ActionChains类来完成模拟鼠标操作手表操作的过程:1.鼠标的操作,先放到一个列表中2.利用 ...
- EF CodeFirst Dome学习
创建ConsoleDome控制台应用程序 从NuGet包管理器安装EntityFramework 创建DbContextDome类并继承DbContext public class DbContext ...
- 单IP、网络、别名管道限速的设置
单IP.网络.别名管道限速的设置 在设备上,控制网络限速最常用的是流量×××中的“限制器”,你可以把它理解为一个管道,20Mit/s的下载管道,那么下载的最大流量就不会超过20Mit/s.流量限制器结 ...
- Matlab组合模式
组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.组合模式的目的是让客户端不再区分操作的是组合对象(Compos ...
- iptables限制访问
iptables限制访问 常用命令 # 查看规则 iptables -L INPUT --line-numbers # 开放指定的端口 iptables -A INPUT -p tcp --dport ...
- JDBC模糊查询的4种方式
1:%放在占位符中 parameters.add("%"+familyMemberQueryBean.getFullName()+"%" ...
- 77.JS本地保存数据的几种方法
1.Cookie 这个恐怕是最常见也是用得最多的技术了,也是比较古老的技术了.COOKIE优点很多,使用起来很方便 但它的缺点也很多: 比如跨域访问问题:无法保存太大的数据(最大仅为4KB):本地保存 ...
- jQuery判断当前页面是APP内打开还是浏览器打开
一.代码如下: function check_useragent() { var browser = { versions: function() { var u = navigator.userAg ...
- CSS-图片整合笔记
注意点: 概念:图片整合技术( css sprite 或 精灵图).通过将多个图片融合到一张图片,然后通过CSS background 背景定位技术技巧布局网页背景 优势:减少 http iis 请求 ...
- Android为TV端助力之解析序列话的JSON
解析json时报错default constructor not found. class............. 比如 public class MediaRepBean implements P ...