HTML5 SSE

Posted thgj0006

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTML5 SSE相关的知识,希望对你有一定的参考价值。

 

html5 服务器发送事件(Server-Sent Events)


服务器发送事件(Server-sent Events)是基于 WebSocket 协议的一种服务器向客户端发送事件和数据的单向通讯。

HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。


Server-Sent 事件 - 单向消息传递

Server-Sent 事件指的是网页自动获取来自服务器的更新。

以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。

例子:Facebook/Twitter 更新、估价更新、新的博文、赛事结果等。


浏览器支持

所有主流浏览器均支持服务器发送事件,除了 Internet Explorer。


接收 Server-Sent 事件通知

EventSource 对象用于接收服务器发送事件通知:

实例

var source=new EventSource("demo_sse.php");
source.onmessage=function(event)
 
  document.getElementById("result").innerHTML+=event.data + "<br>";
  ;


尝试一下 »

实例解析:

  • 创建一个新的 EventSource 对象,然后规定发送更新的页面的 URL(本例中是 "demo_sse.php")

  • 每接收到一次更新,就会发生 onmessage 事件

  • 当 onmessage 事件发生时,把已接收的数据推入 id 为 "result" 的元素中


检测 Server-Sent 事件支持

以下实例,我们编写了一段额外的代码来检测服务器发送事件的浏览器支持情况:

if(typeof(EventSource)!=="undefined")
 
  // 浏览器支持 Server-Sent
  // 一些代码.....
 
else
 
  // 浏览器不支持 Server-Sent..
 


服务器端代码实例

为了让上面的例子可以运行,您还需要能够发送数据更新的服务器(比如 PHP 和 ASP)。

服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为 "text/event-stream"。现在,您可以开始发送事件流了。

<pPHP 代码 (demo_sse.php):

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

$time = date('r');
echo "data: The server time is: $timenn";
flush();
?>

ASP 代码 (VB) (demo_sse.asp):

<%
Response.ContentType="text/event-stream"
Response.Expires=-1
Response.Write("data: " & now())
Response.Flush()
%>

代码解释:

  • 把报头 "Content-Type" 设置为 "text/event-stream"

  • 规定不对页面进行缓存

  • 输出发送日期(始终以 "data: " 开头)

  • 向网页刷新输出数据


EventSource 对象

在上面的例子中,我们使用 onmessage 事件来获取消息。不过还可以使用其他事件:

事件描述
onopen当通往服务器的连接被打开
onmessage当接收到消息
onerror当发生错误

在本节的开头我们介绍过服务器发送事件(Server-sent Events)是基于 WebSocket 协议的,那么在本教程的下节内容中,我们将继续向你介绍 HTML WebSocket

Grails 中的 HTML5 SSE

【中文标题】Grails 中的 HTML5 SSE【英文标题】:HTML5 SSE In Grails 【发布时间】:2016-01-04 10:40:45 【问题描述】:

我试图在 grails 应用程序中使用 HTML5 SSE。以下是实际的示例代码:

def push()
    println "Inside action..."
    response.setContentType("text/event-stream");
    response.setCharacterEncoding("UTF-8");
    render("data: $System.currentTimeMillis()");

客户端代码:

<script type="text/javascript">
    if(typeof(EventSource) !== "undefined") 
        var source = new EventSource("push");
        source.onmessage = function(event) 
            console.debug("event triggered...");
            document.getElementById("result").innerHTML += event.data + "<br>";
        ;
        source.onerror = function(event) 
            console.log(event.message);
        
     else 
        document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
    
</script>

但是 onmessage 事件没有被触发。 onerror 被触发并打印 undefined。它会执行正确的操作,但不会流式传输数据。

我也试过了:

response.outputStream.write(...........)
response.outputStream.flush()

但不起作用。

请提出建议。

【问题讨论】:

【参考方案1】:

好吧,我解决了。我用过:

    PrintWriter writer = response.getWriter();

    writer.write("data:"+System.currentTimeMillis()+"\n\n")

它成功了。

【讨论】:

您好 Vivek,您是如何设法刷新数据并避免在控制器/操作完成后关闭连接的?

以上是关于HTML5 SSE的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 -1- 简介

HTML5简介

HTML5 学习总结——HTML5概要与新增标签

后盾网html5教程

HTML5前景如何?HTML5好找工作吗?

HTML5教程