html5之服务器推送事件

用于服务器实时向客户端推送消息,这个是单向推送server to client

服务器端

  header头

  要想服务器端推送:在服务器端的报头要定义:
  header(‘Content-Type:text/event-stream‘),服务器发送的响应内容应该使用这种`text/event-stream`的MIME;这样客户端才能理解你这是发送的不是普通的数据,   eventsource对象才能识别

  事件流

服务器端发送事件流(内容);
 每执行一次php文件就产生一个事件流;
 事件流是由多个消息组成;
 消息是一个后面都有一个空行作为分隔符
 一个消息就是一个事件
 一个消息可以由一个或者多个字段组成
 字段是由字段名,冒号,字段值(数据),`字段名:值`;
 产生一个空行(即两个换行符)代表一个事件(消息)的结束
 在一个文件中定义多个未命名事件,后面的会覆盖前面的,
 消息中的多个字段用一个`\n`(换行符)分隔
 一个消息的结束用`\n\n`(产生一个空行);
 一个字段的开始必须是以`data:`开头,例如`data:hello world!\n`,客户端会接受到`hello world!`,
 编码形式只能是使用utf-8,不能自己指定
 说的也是云里雾里,其实你只要知道我要用这种特定的格式来发送数据就行,直接下面的代码解释

服务器代码

我就解说下面三个消息,解释完了也就明白了,
1. 开始:报头,这个是必须的,就是要告诉客户端,你要把我的数据放在eventSource对象中;
2. 第一个消息:第一个字段是打印一个时间,第二个字段打印一个‘nihao’,第三个字段打印‘hehe’,第四个字段打印‘nihaoo’,第五个字段打印‘bbbb’;最后两个\n\n代表消息的结束
注意:每个字段后面是有一个\n,来告诉浏览器我这是一个字段,而两个\n\n,是告诉浏览器我这个消息结束了。每个字段的开头必须是:data:,这个一个没有事件名的消息
3. 第二个事件是有事件名,有名字的事件是使用event:开头,值是事件名,这第二个消息就是定义了一个名字为hello的事件。
4. 第三个消息:差别就是这次发送的是一个json

 //服务器代码
    <?php
    header(‘Content-Type:text/event-stream‘);
    // header("Cache-Control:no-cache");//有的浏览器会缓存,如果默认是缓存的话就加上这句
    date_default_timezone_set(‘Asia/Shanghai‘);
    //第一个消息
    while(1) {
        echo ‘data:‘.date(‘Y-m-d H:i:s‘)."\n";
        echo "data: nihao\ndata: hehe\n";
        echo "data: nihaoo\n";
        echo ‘data: bbbb‘;
        echo "\n\n";
        //第二个消息
        echo "event: hello\n";
        echo "data: world\n\n";
        //第三个消息
        echo "event:hh\n";
        echo ‘data: {"time":"aaaa"}‘."\n";
        echo "\n\n";
        flush();
        sleep(1);
    }
    ?>

服务器代码

客户端
EventSource
这个API,要使用它,必须先实例化,并且必须给他传递一个参数,这个参数就是请求服务器的地址
`var ES = new EventSource(‘服务器地址‘)`;
监听
EventSource对象属性和方法
属性 
 error
 message
 open
 readyState
 url

方法
close()

- 当连接发生错误的时候触发error事件
- 当成功连接时触发open事件
- 当接收到没有命名的事件时触发message事件
- readyState返回当前状态
- 0 =>正在建立连接
- 1 =>连接处于打开状态,正在调度事件
- 2 =>没有建立连接
- url返回页面地址
- close(),关闭连接
当成功连接后它会一直处于监听状态,监听服务器发送来的信息,如果断开了连接,客户端会自动重新进行连接,除非你用close关闭。

命名事件
命名事件的接收要用addEventListener来监听,用法就像我下面代码写的
未命名事件
用DOM0级的方法或者是DOM2级的方法都行
`ES.onmessage = function(e){}`
`ES.addEventListener(‘message‘,function(e){});`
解析
JSON
如果接收的是json,则要先解析`JSON.parse(e.data)`;
多字段
对于多个字段的,如果向要解析出来每个字段来,就要使用正则表达式,由于浏览器会把整个消息变成一个字符串,并在每个字段后面添加一个换行符,而String类型有一个split方法,只需要用换行符作分隔,所以只需要`e.data.split(/\s/)`,这就返回一个数组,数组的每一项就是一个字读的值

 //客户端代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>服务器推送</title>
    </head>
    <body>
    <div id="box"></div>
    <div id="box2"></div>
    <div id="box3"></div>
    <script>
        var evtSource = new EventSource(‘server.php‘);
        var box = document.getElementById("box");
        var box2 = document.getElementById(‘box2‘);
        var box3 = document.getElementById(‘box3‘);
        //
        evtSource.onerror = function(e) {
        console.log(‘error‘);
        }
        evtSource.onopen = function(e) {
            console.log("open");
        }
        evtSource.onmessage = function (e) {
            //2015-06-12 22:09:04 nihao hehe nihaoo bbbb
            box.innerHTML = e.data;
            //["2015-06-12", "22:08:55", "nihao", "hehe", "nihaoo", "bbbb"]
            console.log(e.data.split(/\s/));
            //http://127.0.0.1/server.php
            console.log(evtSource.url)
        }
        evtSource.addEventListener(‘hello‘,function(e) {
            //world
            box2.innerHTML = e.data;
        });
        evtSource.addEventListener(‘hh‘,function(evt) {
            //aaaa
            box3.innerHTML = JSON.parse(evt.data).time;
        });
    </script>
    </body>
    </html>

问题
在使用的过程中可能会遇到php进行了缓存,这样的会导致,客户端数据不能及时的更新,你需要在php.ini中禁止掉缓存 `output_buffering = On`这项你禁止掉,并且在php文件中`flush()`;

很久没有在博客园写文章了,总是感觉要写出有点质量的文章才能拿出来,至少是自己认为的,但是写有点质量的文章,总是感觉自己水平不行。有时想记录学习笔记,于是我就在github上弄了一个静态网站,这里我会记录我的学习和复习过程,一些小的东西我也会记录的。地址:www.evil007.com。名字很吓人,就是为了霸气了。嘿嘿。

参考:

w3c:eventsource:http://www.w3.org/TR/eventsource/
MDN:https://developer.mozilla.org/zh-CN/docs/Server-sent_events/EventSource

时间: 2024-10-14 15:54:10

html5之服务器推送事件的相关文章

HTML5 服务器推送事件(Server-sent Events)实战开发

转自:http://www.ibm.com/developerworks/cn/web/1307_chengfu_serversentevent/ http://www.ibm.com/developerworks/cn/web/wa-lo-comet/     --comet长连接 服务器推送事件(Server-sent Events)是 HTML 5 规范中的一个组成部分,可以用来从服务端实时推送数据到浏览器端.相对于与之类似的 COMET 和 WebSocket 技术来说,服务器推送事件的

SSE技术详解:一种全新的HTML5服务器推送事件技术

前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events).关于这4种技术方式的优缺点,请参考<Web端即时通讯技术盘点:短轮询.Comet.Websocket.SSE>.本文将专门讲解SSE技术. 服务器推送事件(Server-sent Events),简称SSE,是 HTML 5 规范中的一个组成部分,可以用来从服务端

springweb flux 服务器推送事件

以前做服务器推送一般用轮询,后端主动给客户端推送不是很好解决.有时候也可以采用websocket 现在看了springwebflux,用它自带的方法做服务器推送方便多了. 代码如下: import org.springframework.http.codec.ServerSentEvent; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotati

HTML5服务器推送事件

目前客户端(浏览器)和服务端交互大致有以下几种方式: 1)form表单提交方式,适合访问量不大,对用户体验要求不高的web系统开发,或者页面整体刷新无伤大雅的场合,通信方向是客户端提交给服务端,是客户端主动发起: 2)Ajax方式,特点是用户体验好,无需页面整体刷新,对服务器压力也小,有利于客户端和服务端的解耦,也是目前广为使用的一种客户端服务端交互方式,它也是通过客户端发起请求,服务端接受处理,通信方向和form表单相同: 3)server-sent-event,它是服务端主动向客户端(浏览器

HTML5服务器端推送事件 解决PHP微信墙推送问题

问题描述 以前的文章中<PHP微信墙制作,开源>已经用PHP搭建了一个微信墙获取信息的服务器,然后我就在想推送技术应该怎么解决,上一篇已经用了.NET 的signalr做了一个微信墙,PHP一直没什么好思路,本来想用websocket,但自己写socket要解析websocket协议,PHP有一个比较好的实现是workerman,github地址请戳这里,但是都不是很中意,昨天给自己做官网的时候,看了一下MDN,浏览发现了这个东西"使用服务器发送事件",突然就有了思路,今天

Html5 服务端推送 Server-Sent Event

服务器推送事件(Server-sent Events)是 HTML 5 规范中的一个组成部分,可以用来从服务端实时推送数据到浏览器端.相对于与之类似的 COMET 和 WebSocket 技术来说,服务器推送事件的使用更简单,对服务器端的改动也比较小.对于某些类型的应用来说,服务器推送事件是最佳的选择. WebSocket 在介绍 HTML 5 服务器推送事件之前,首先介绍一些上面提到的几种服务器端数据推送技术.第一种是 WebSocket.WebSocket 规范是 HTML 5 中的一个重要

HTML5中的服务器‘推送’技术 -Server-Sent Events

转帖:http://www.developersky.net/thread-63-1-1.html 一直以来,HTTP协议都是严格遵循Request-Response模型的.客户端发送一个Request到服务器,服务器对Request作出响应并将Response发送回客户端.也就是说,所有的互动都是由客户端发起的,服务器不会发起任何互动.为了创建互动性更强的web应用程序,AJAX出现了,AJAX实现了一个动态的从Server获取数据的方法.通过使用AJAX,浏览器通过XMLHttpReques

服务器推送初探

服务器推送,Comet,反向Ajax,多种名字,捯饬起来也是相当费劲. 先来看服务端: w3cSchool有个简单的例子,http://www.w3school.com.cn/html5/html_5_serversentevents.asp. 对于php,有几点需要注意: 1)设置header, header('Content-Type: text/event-stream'); 若不设置,会报错的. 2)在echo信息的时候,如果字符串过短,会不输出 最好先输出一堆空格: str_repea

服务器推送

WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,WebSocketAPI被W3C定为标准. 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送. 背景 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然