关于HTML5服务器发送事件(SSE)
最近在看 W3School 上关于 HTML 5 的教程。在看到 HTML 5 服务器发送事件 ( SSE, server-sent event ) 时,没怎么弄明白示例代码是怎么回事,寻找其他教程,大部分也只给出了类似的代码,没有解释。花了一点时间,大概弄清楚了,这里记录一下。
一段示例代码
利用 SSE,网页可以自动获取来自服务器的更新。以前也可能做到这一点 ( 如 AJAX ),前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。简单说就是把轮询获取更新的方式 ( pull ) ,改为接受服务器主动推送的方式 ( push )。
下面是 W3School 上的一段示例代码,包含客户端的 JavaScript ,以及服务端的 PHP 代码:
var source = new EventSource("demo_sse.php");
source.onmessage = function(event) {
document.getElementById("result").innerHTML += event.data + "<br />";
};
这段代码不断的从 demo_sse.php 获取数据,并将得到的结果输出到 id 为 result 的 div 中。
<?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();
?>
这段代码将服务器当前时间,回复给客户端。最终,客户端页面上显示出了如下结果:
The server time is: Fri, 29 Aug 2014 02:03:21 +0800
The server time is: Fri, 29 Aug 2014 02:03:24 +0800
The server time is: Fri, 29 Aug 2014 02:03:27 +0800
The server time is: Fri, 29 Aug 2014 02:03:30 +0800
The server time is: Fri, 29 Aug 2014 02:03:33 +0800
The server time is: Fri, 29 Aug 2014 02:03:36 +0800
The server time is: Fri, 29 Aug 2014 02:03:39 +0800
The server time is: Fri, 29 Aug 2014 02:03:42 +0800
The server time is: Fri, 29 Aug 2014 02:03:45 +0800
The server time is: Fri, 29 Aug 2014 02:03:48 +0800
...
页面每3秒钟显示1次服务器时间。这一过程,具体是如何实现的?这里存在一个明显的问题:对于 demo_sse.php 来说,每次相应客户端的请求,服务端只会输出1次系统当前时间,使用 flush() 方法清空输出缓冲区,本次 HTTP 会话立刻结束。那页面为何会显示出一连串的时间戳呢?如果客户端每过一个时间间隔,就向服务器发出一次请求,那么和之前的轮询式 ( pull ) 更新方式有什么区别呢?
发生了什么
首先确认,这段 JavaScript 代码都做了什么,用简单的 HTTP 抓包程序,得到了下图中的结果:

左边列表中,每一项代表了一次 HTTP 请求,可以看到,客户端 (浏览器),每3秒钟向 demo_sse.php 发出一次 GET 请求,且每次请求都一模一样。客户端确实是采取了一种类似于轮询 ( pull ) 的方式获取更新,这并不是我们想要的结果。
举个例子,如果这个网页需要显示 Apple 公司的实时股价,我们更倾向于当股价有变化时,服务器主动将变化后的股价推送给客户端,而不是客户端每隔3秒询问一次服务端,Apple 公司的股价有没有变化 (在移动客户端中,问题更严重,轮询式的更新将极大增加用户设备的电量消耗,缩短待机时间,并消耗用户的流量)。
那么如何实现让服务器主动推送呢。其实很简单,只要让服务器保持 HTTP 会话不关闭,当有新的更新时,立刻输出,并 flush() 即可。下面的例子中,服务端保持 HTTP 会话不中断,每隔10秒,发送一个递增的数字。
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$i = 0;
while (true) {
echo "data: ". $i++ ."\n\n";
flush();
// 暂停10秒
sleep(10);
}
?>
保持客户端的代码不变。客户端页面,每隔10秒钟显示一行递增的数字。并且从抓包结果看,客户端只对服务端发起了一次 HTTP 请求,从而实现了每当有新的信息,服务器主动推送到客户端 ( push ),而非客户端轮询 ( pull )。
必须说明,这段代码只是为了演示 SSE 如何工作,并没有任何实用价值。使用 PHP 通过这样的方式维持长时间的 HTTP 会话并不优雅。事实上,保持客户端页面一段时间后,HTTP 会话被服务器因超时中断。这时,客户端将在3秒后,再次发出 GET 请求,直到服务端再次中断,等待3秒后再次发出请求……客户端不断循环这一过程。
关于HTML5服务器发送事件(SSE)的更多相关文章
- HTML5服务器发送事件(Server-Send Events)
HTML5服务器发送事件是允许获得来自服务器的更新. server-sent事件-单向传递消息,表示网页自动获取来自服务器的更新. 其中有一个重要的对象,eventsource对象是用来接收服务器发送 ...
- HTML5 服务器发送事件(Server-Sent Events)
沈阳SEO:HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获 ...
- HTML5: HTML5 服务器发送事件(Server-Sent Events)
ylbtech-HTML5: HTML5 服务器发送事件(Server-Sent Events) 1.返回顶部 1. HTML5 服务器发送事件(Server-Sent Events) HTML5 服 ...
- HTML5 服务器发送事件(Server-Sent Events)介绍
w3cschool菜鸟教程 Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新 ...
- HTML5学习笔记(七)HTML5 服务器发送事件(Server-Sent Events)
Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新.通过服务器发送事件,更新能够自动到达. EventSource 对象用于接 ...
- Server-Sent Events(HTML5 服务器发送事件)
Server-Sent Events简介 Server-Sent Events(SSE)用于网页自动获取服务器上更新的数据,它是一个实时性的机制. 实时性获取数据的解决方案 对于某些需要实时更新的数据 ...
- [ASP.NET MVC] Real-time之HTML5 服务器发送事件(server-sent event)
最近有时间,打算看看SignalR,顺便了解一下Server Sent Events. Controller 输出的数据格式为:data:[数据]\n\n.输出的数据尝试8000多字符也没问题,具体的 ...
- HTML5 服务器发送事件
单向传输:服务器端——>客户端 作用:传回的能每过3s重新刷新一遍.从而能过跟数据库同步,与ajax配合使用 一.客户端写法 必须的用 message 方法 JSON.parse() ...
- HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)
传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...
随机推荐
- Django路由分发
1. 先自己手动在项目APP01以及APP02下面各有一个urls.py.当请求来了的时候,先到工程中的urls找路由分发,然后再转到各个App中. 现在总共有3个url 2. 工程中的urls如下: ...
- 【BZOJ3244】【NOI2013】树的计数(神仙题)
[BZOJ3244][NOI2013]树的计数(神仙题) 题面 BZOJ 这题有点假,\(bzoj\)上如果要交的话请输出\(ans-0.001,ans,ans+0.001\) 题解 数的形态和编号没 ...
- NOIP2003 传染病控制 【搜索 + 卡时】
题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...
- Linux分析第六周——进程的描述和进程的创建
Linux分析第六周--进程的描述和进程的创建 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...
- web项目引用tomcat中的jar
web项目引用tomcat中的jar https://blog.csdn.net/zjsdrs/article/details/77868827 如下图所示
- 图像PNG格式介绍
1 图像png格式简介 PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性.流式网络图形格式(PortableN ...
- POJ1011 木棒(dfs+剪枝)
问题重述: Description乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始 ...
- TCP ------ 抓包分析(seq ack)
总结: 1.ACK包可以和其他包合在一起,比如ACK包可以携带数据 2.可以接收多个数据包后,一次性给一个应答,不用每个数据包一一对应给应答 3.在通信过程中,通过接收到的包的ack值可以判断是否是上 ...
- Rabbitmq -- rpc
一.前言 MQ本身是基于异步的消息处理,前面的示例中所有的生产者(P)将消息发送到RabbitMQ后不会知道消费者(C)处理成功或者失败(甚至连有没有消费者来处理这条消息都不知道).但实际的应用场景中 ...
- 题解 UVA1184 【Air Raid】
有向无环图(DAG)的最小路径覆盖的模板题. 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 由题意可得这是一个有向图,而路径不能相交,于是我们知道这是无向图的不相交最小路径覆盖问 ...