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(data) {
                //console.log(data);
                json = JSON.parse(data);
                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));
    /**
     * 开始轮询
     * @param  number spend AjaxGet 的速度 单位是毫秒
     */
    this.open = function(spend) {
        var onmessage = this.onmessage;
        var url = this.url;
        if(typeof spend == ‘undefined‘) spend = 5000;
        if(this.PollType == ‘AjaxGet‘) {
            //采用轮询
            this.resource = {};
            this.resource.lockInt = setInterval(function(){
                try{
                    $.get(url,{},function(json){
                        if(typeof onmessage == ‘function‘) onmessage(json);
                    });
                }catch(e){
                    alert(e.message);
                }
            },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) {
                if(typeof onmessage == ‘function‘) onmessage(e.data);
            }
            this.resource.onerror = function(e) {
                if(this.readyState == 2) alert(‘连接没有被建立,或者已经关闭,或者发生了某个致命错误‘);
            }
        }
    }
    /**
     * 关闭轮询
     */
    this.close = function() {
        if(this.resource) this.resource.close();
    }
}

服务端代码:

<?php
header("Content-type: text/html; charset=utf-8");
date_default_timezone_set("Asia/Shanghai");

$result = array(‘code‘=>0,‘msg‘=>‘拉取成功‘,‘data‘=>‘当前时间是:‘.date(‘Y-m-d H:i:s‘));
$result = json_encode($result);
$PollType = isset($_GET[‘PollType‘]) ? trim($_GET[‘PollType‘]) : ‘‘;

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:1000‘."\n\n"; //告诉客户端,按 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

时间: 2024-10-11 13:00:23

javascript轮询请求服务器的相关文章

ajax轮询请求实现源码分享

ajax轮询请求状态是ajax学习中非常重要的也是必须掌握的知识点,今天就和大家一起来分享一下这部分内容,一起来看看吧.      这里要实现的功能是:通过扫码微信公众号带参数的二维码,来登录网站.      但很明显,如果ajax不间断的请求服务器,这样会加重服务器的负荷,所以本例采用的是js的setInterval来周期性调用执行一个ajax函数来来向服务器请求数据,但请求成功或者请求一定次数后还未成功时用clearinterval函数清空计时器. 代码和注释如下:(后端采用thinkPHP

Ajax轮询请求

Ajax轮询请求 什么是轮询? 轮询(polling):客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. Ajax轮询需要服务器有很快的处理速度与快速响应. Ajax轮询实现 Ajax轮询原理 客户端是按照规定时间(这个时间由你设定,此处默认为1秒)像服务端发送请求,前一次请求完成后,无论有无结果返回,一秒之后下一次请求又会发出.这就叫做Ajax轮询. <script> $(function(){ var code,status; function g

常规轮询请求,客户端用Ajax调webservice的方法

服务端发布webservice,下图方框中的一定要有 客户端代码 <script type="text/javascript"> $(document).ready(function () { getWebservice(); setInterval(getWebservice, 1000); }); var swic = true; var count = 1; function getWebservice() { //调用无参数方法 $.ajax({ type: &qu

利用ajax短轮询+php与服务器交互制作简易即时聊天网站

主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 本文主要介绍ajax短轮询的简易实现方式. 看懂此文需要:ajax基础,php基础,sql基础,html/jquery基础 ---------------------------- 本人也是web新手,今天听说女票在学websocket,还做了个简易的网站利用广播和我通信.但是刷新一下数据就没了.. 我觉得这个还是挺有意思的,,就想着能不能做一个刷新

ajax短轮询+php与服务器交互制作简易即时聊天网站

主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 本文主要介绍ajax短轮询的简易实现方式. 看懂此文需要:ajax基础,php基础,mysql基础,html/jquery基础 ---------------------------- 本人也是web新手,今天听说女票在学websocket,还做了个简易的网站利用广播和我通信.但是刷新一下数据就没了.. 我觉得这个还是挺有意思的,,就想着能不能做一个

长轮询 VS 短轮询

创建基础Web的实时系统时,通常会使用的到HTTP,但HTTP天生不是为实时,双向沟通设计的.我们如何解决这个问题呢? 我们先来看一下HTTP协议: http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http 长连接: 目前 http 协议普遍使用的是 1.1 版本, 之前有个 1.0 版本, 两者之间的一个区别是 1.1 支持 http 长连接, 或者叫持

long poll、ajax轮询和WebSocket

websocket 的认识深刻有木有.所以转到我博客里,分享一下.比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗,纯粹为分享.废话这么多了,最后再赞一个~ WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 1.1 和 keep-alive ,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说

http长轮询&amp;短轮询

http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http 长连接: 目前 http 协议普遍使用的是 1.1 版本, 之前有个 1.0 版本, 两者之间的一个区别是 1.1 支持 http 长连接, 或者叫持久连接.1.0 不支持 http 长连接, 每次一个 http 请求响应后都关闭 tcp 连接, 下个 http 请求会重新建立 tcp 连接. 所谓

COMET探索系列二【Ajax轮询复用模型】

COMET探索系列二[Ajax轮询复用模型] 写在前面:Ajax轮询相信大家都信手拈来在用,可是有这么一个问题,如果一个网站中同时有好多个地方需要用到这种轮询呢?就拿我们网站来说,有一个未读消息数提醒.还有一个时实时加载最新说说.昨天又加了一个全网喊话,以后还会要有类似功能添加是肯定的,难道要为每个功能都创建一个独立的轮询?要知道轮询请求中有大半是无用,会对服务器资源和宽带造成巨大的浪费.因此在页面中每增加一个轮询点,对服务器的压力及宽带浪费都将成倍的增长.再考虑一个情况,如果当前网页中需要的不