HTML5服务器推送事件

目前客户端(浏览器)和服务端交互大致有以下几种方式:

1)form表单提交方式,适合访问量不大,对用户体验要求不高的web系统开发,或者页面整体刷新无伤大雅的场合,通信方向是客户端提交给服务端,是客户端主动发起;

2)Ajax方式,特点是用户体验好,无需页面整体刷新,对服务器压力也小,有利于客户端和服务端的解耦,也是目前广为使用的一种客户端服务端交互方式,它也是通过客户端发起请求,服务端接受处理,通信方向和form表单相同;

3)server-sent-event,它是服务端主动向客户端(浏览器)发送数据,客户端监听并接受,然后处理,通信方向也是单向的,但是和上面两种相反,是服务端发起,客户端接受,但是其应用层协议还是基于http的。

4)web socket,这是将以前服务端通信的套接字原理实现在了浏览器上,使得浏览器和服务端可以相互发送消息,通信方向是双向的,只要连接一建立,双方都可以向对方发送数据,无需哪一方先来后来,应用层协议基于WS协议。

上面第3第4由于是HTML5中新添加的功能,所以在很多老版的浏览器中(如IE6-IE8)还不支持,因此应用还不够广泛.

这里主要实现的是第三种方式,即服务端推送事件,直接上代码

客户端代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    (function()
    {
        var source;
        if (!!window.EventSource) {
             source = new EventSource(‘http://localhost/server.php‘);
        }
       source.onmessage=function(e)
       {
        var oSpan=document.createElement(‘span‘);
           oSpan.innerHTML=e.data+"<br>";

        var oDiv=document.querySelector("#div1");
           oDiv.appendChild(oSpan);
       }

    })();
</script>
<div id="div1"></div>
</body>
</html>

 以上代码构造一个eventSource对象,指向一个服务端后台PHP文件,这个对象是HTML5中的服务端推送事件API封装对象,然后添加onmessage事件,用来监听服务端发送过来的消息,服务端一有消息发送,就会执行这个事件的回调函数,这里让它接收到数据之后将其包裹在span中并将这个span插入到div中。

服务端代码server.PHP

<?php
header(‘Content-Type: text/event-stream‘);
header(‘Cache-Control: no-cache‘);

function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}

for($i=0;$i<=1000;$i++)
{
$serverTime = time();
sendMsg($serverTime, ‘server time: ‘ . date("h:i:s", time()));
sleep(2);

}

  首先要设定其发送给客户端http报文中的首部

header(‘Content-Type: text/event-stream‘);这是服务端推送事件特定的MIME类型,
header(‘Cache-Control: no-cache‘);表示不让浏览器进行缓存然后每隔两秒向客户端发送一个时间戳,客户端接收到之后,显示到div中,效果如下:

有了这种通信方式,我们制裁采用的Ajax长轮询的方式来模拟服务器端推送事件就可以不用了,如果服务端收到一些需要通知客户端的信息,那么可以直接发送给客户端,而不必等待其发送请求。
时间: 2024-08-14 11:41:17

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

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

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

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 技术来说,服务器推送事件的

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

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

springweb flux 服务器推送事件

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

html5之服务器推送事件

用于服务器实时向客户端推送消息,这个是单向推送server to client 服务器端 header头 要想服务器端推送:在服务器端的报头要定义: header('Content-Type:text/event-stream'),服务器发送的响应内容应该使用这种`text/event-stream`的MIME;这样客户端才能理解你这是发送的不是普通的数据, eventsource对象才能识别 事件流 服务器端发送事件流(内容); 每执行一次php文件就产生一个事件流: 事件流是由多个消息组成:

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,然

基于Tomcat7、Java、WebSocket的服务器推送聊天室

http://blog.csdn.net/leecho571/article/details/9707497 http://blog.fens.me/java-websocket-intro/ java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tomcat从7.0.47开始支持JSR356,这样一来写WebSocket的时候,所用的代码都是可以一样的. HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发