【SSE】实现服务端数据推送方式

老的http协议是请求-响应式的,对于某些实时性要求比较高的需求(例如微博消息推送),实现起来是比较麻烦

html5标准中,新增了一个SSE(server-sent event,服务端推送事件)允许服务器端向客户端推送新数据(简称数据推送)的HTML5技术

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

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

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

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

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

sse是直接建立在当前http连接上的,本质上是保持一个http长连接,但是和comet不同的是:comet是每次服务端返回数据后,连接关闭然后客户端马上再次发起连接。而sse是保持长连接常驻。

而客户端对数据的通信是通过js的EventSource来进行的,EventSource提供了三个事件:
1、open:当成功建立连接时产生
2、message:当接收到消息时产生
3、error:当出现错误时产生
直接使用即可。
<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>
<!doctype html>
<?php
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    $time = date('Y-m-d H:i:s');

    echo 'retry: 1000'.PHP_EOL;
    echo 'data: The server time is: '.$time.PHP_EOL.PHP_EOL;
?>


空白:表示该行是注释,会在处理时被忽略。
data:表示该行包含的是数据。以 data 开头的行可以出现多次。所有这些行都是该事件的数据。
event:表示该行用来声明事件的类型。浏览器在收到数据时,会产生对应类型的事件。
id:表示该行用来声明事件的标识符。
retry,表示该行用来声明浏览器在连接断开之后进行再次连接之前的等待时间。

jdfw.gif


***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

点赞

发表评论