HTML5 SSE 数据推送应用开发

  javascript表达行为,css表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据自己)一般须要更新数据时,并不须要更新结构,正是这种不改变组织结构仅改变数据的诉求,推进了数据拉取和数据推送技术的产生。javascript

 

SSE是一种容许服务器端向客户端推送新数据(简称数据推送)的HTML5技术。数据推送有两种替代方案:无更新方案和数据拉取方案。php

 

无更新方案:css

加载完毕HTML以后,获得一个HTML页面,以后浏览器会请求图片、CSS文件和JavaScript文件等,他们都是浏览器能够缓存的静态文件。若是页面使用后端语言,好比PHP、Ruby和Python等为用户动态生成HTML的语言。html

 

数据拉取方案:java

浏览器会基于一些用户行为,或在必定时间以后,或基于某种别的触发方案,向服务器端请求或所有更新数据,经过javascript或一个meta标签可以命令整个页面从新加载。咱们所熟悉的Ajax技术只被用于请求最新数据,当收到数据时,javascript函数会利用它来局部更新DOM。数据拉取的要义:仅拉取新数据,而且只更新页面中受影响部分。数据库

 

以上的都不是数据推送,数据推送不是静态文件,也不涉及浏览器为更新数据而发起请求,数据推送是由服务器选择客户端发送新数据。后端

当数据源有新数据时,服务器端能马上发送给一个或多个客户端,而不用等客户端来请求,这些新数据多是突发新闻、最新股票、上线朋友的聊天信息、新的天气预报、策略游戏中的下一步等。浏览器

 

SSE适用于更新频繁、低延迟而且数据都是从服务端到客户端。它和WebSocket的区别:缓存

1)便利,不须要添加任何新组件,用任何习惯的后端语言和框架就能继续使用,不用为新建虚拟机弄一个新的IP或新的端口号而劳神。服务器

2)服务器端的简洁。由于SSE能在现有的HTTP/HTTPS协议上运做,因此它可以直接运行于现有的代理服务器和认证技术。

WebSocket相较SSE最大的优点在于它是双向交流的,这意味着服务器发送数据就像从服务器接受数据同样简单,而SSE通常经过一个独立的Ajax请求从客户端向服务端传送数据,所以相对于WebSocket使用Ajax会增长开销。所以,若是须要以每秒一次或者更快的频率向服务端传输数据,就应该用WebSocket,

 

具体代码以下:

html

<!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>basic SSE test</title>
    </head>
    <body>
        <pre id = "x">initializting...</pre>
        <!--之因此使用pre标签而不是p或者div是为了确保数据能以它被接受时的格式呈现,而不会修改或格式化-->

    </body>
    <script>
        var es = new EventSource("basic_sse.php");
        es.addEventListener("message",function(e){
            //e.data
            document.getElementById("x").innerHTML += "\n"+e.data;
        },false);//使用false表示在冒泡阶段处理事件,而不是捕获阶段。
    </script>
</html>

须要注意的是:使用服务器端数据以前最好作一下检查,以防潜在的javascript注入攻击。

 

php

<?php
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    $time = date('r');
    echo "data: The server time is: {$time}\n\n";
    flush();
?>

  “Content-Type: text/event-stream"是专门为SSE设计的MIME类型,

效果截图

 何时数据推送是错误的选择

  首先考虑静态的状况,不引入数据推送,每当用户打开一个页面,在浏览器和服务器之间就会打开i一个套接字链接,服务器手机信息而后返回给用户,可能很简单,就像从磁盘上加载一个静态的HTML文件或一张图片同样,也可能很复杂,就像要运行一段用以链接不少数据库的后台语言。这里的关键点就是,一旦返回了所需的信息,套接字就会关闭,每一个HTTP请求都会打开一个这种生命周期相对较短的套接字链接,这些套接字是服务器上有限的资源,每当它们完成既定任务,就会被回收以循环再利用。

  如今对比看一下数据推送。一个请求永远不会完成,老是有不少信息要发送,因此套接字会一直保持打开状态。显然,由于它们是有限的资源,因此同一时刻的SSE链接数会有限制。

  想象一种状况,你在为你最新的应用提供电话服务支持,有10个接线中心员工为1000个用户提供服务,用户遇到问题,其中一个接线员接线,而后挂线。新的客户呼叫在排队,知道其中一个接线员挂线,这是典型的网络服务模式。

  可是,如今有个客户打过来讲,我如今没有问题,可是接下来几个小时都会用到大家的产品,而且若是遇到问题,我但愿大家当即回复。这个客户将与接线员保持通话几个小时,那么呼叫中心的10%服务资源就被浪费。若是有10个这样的客户,那么其余990个客户就没法呼叫。这就是数据推送模式。

  固然,这并不老是坏事,若是这个客户一下午每隔几秒钟就有一个问题,这种状况保持电话通畅不但没有浪费10%服务资源,反而会增长。由于每一个问题都须要新打一个电话(就像数据拉取),接线员须要花额外的时间,验证客户身份,调出帐户,下降服务效率。保持电话一般不只使得客户更满意,也会提升呼叫中心的工做效率,这就是数据推送的最适合场景。  

相关文章
相关标签/搜索