您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13989|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-9-4 18:54:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。- R- i( E* ~" X, [8 \


$ P$ E5 S, w3 D7 t9 \" R) C/ i7 |. y/ ~5 H% \0 B8 E5 A# W
Server-Sent 事件 - 单向消息传递
Server-Sent 事件指的是网页自动获取来自服务器的更新。
以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。
例子:Facebook/Twitter 更新、股价更新、新的博文、赛事结果等。


/ r  {+ h0 G  r$ l+ d6 \接收 Server-Sent 事件通知
EventSource 对象用于接收服务器发送事件通知:
  1. var source=new EventSource("demo_sse.php");
    7 B+ R9 Q/ \+ u1 _
  2. source.onmessage=function(event)7 S' I1 u9 y, Y: P$ W: t
  3. {
    ) g" j" t6 X, R8 Y5 \
  4.     document.getElementById("result").innerHTML+=event.data + "<br>";
    2 X& W6 j. {; x+ y' E6 ]$ v: B
  5. };
复制代码
实例解析:
  • 创建一个新的 EventSource 对象,然后规定发送更新的页面的 URL(本例中是 "demo_sse.php")
  • 每接收到一次更新,就会发生 onmessage 事件
  • 当 onmessage 事件发生时,把已接收的数据推入 id 为 "result" 的元素中8 C) X7 ~: d1 Y9 s. l4 k/ S

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

  1. if(typeof(EventSource)!=="undefined")
    ' F2 D: G# r9 {3 n( b7 I. E
  2. {* }+ Q1 D1 J9 E# v' ]
  3.     // 浏览器支持 Server-Sent
    ; f! ?3 h! ]* L; M" `( l  \/ O
  4.     // 一些代码.....( f0 \! _. z4 S0 O2 d+ I
  5. }+ D0 J+ _, o% K% O5 v
  6. else
    ; |% H( K/ `- {) {
  7. {
    3 |- ~5 t5 R* W+ o  O! j! b! |2 x6 T
  8.     // 浏览器不支持 Server-Sent..
    ) Z$ w$ V* R6 U) [) V- c
  9. }
复制代码

服务器端代码实例
为了让上面的例子可以运行,您还需要能够发送数据更新的服务器(比如 PHP 和 ASP)。
服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为 "text/event-stream"。现在,您可以开始发送事件流了。
  1. <?php
    % v( g- g5 N5 K/ L
  2. header('Content-Type: text/event-stream'); 5 c4 I" d; r' N- X( V& c* d; P
  3. header('Cache-Control: no-cache'); & R8 V; _# Q6 E) Y( U
  4.   s7 w- P$ b- R8 Z5 |$ ?: V
  5. $time = date('r'); % M/ d# n4 _" P/ Q+ y( y- s
  6. echo "data: The server time is: {$time}\n\n";
    9 ~4 r; P/ v* X7 s3 i
  7. flush(); ; C5 W3 @: y: z; ]
  8. ?>
复制代码
ASP 代码 (VB) (demo_sse.asp):
  1. <%: M; ?0 [6 ?/ J: c% P
  2. Response.ContentType="text/event-stream"
    " n: x$ Y4 M0 u1 a. d, [
  3. Response.Expires=-12 l+ a8 ^- o8 r* R5 ~) r
  4. Response.Write("data: " & now())7 e1 i" [2 ~; Y; ^  n, l
  5. Response.Flush()
    : [$ Z$ E3 ]/ t) ]# p0 ~
  6. %>
复制代码
代码解释:
  • 把报头 "Content-Type" 设置为 "text/event-stream"
  • 规定不对页面进行缓存
  • 输出发送日期(始终以 "data: " 开头)
  • 向网页刷新输出数据# T, B7 x: ?$ u, A$ r0 O; Y. H

EventSource 对象
在上面的例子中,我们使用 onmessage 事件来获取消息。不过还可以使用其他事件:
事件
描述
onopen当通往服务器的连接被打开
onmessage当接收到消息
onerror当发生错误

, J2 H3 [' d) P' \+ r- P
: B% Q# `* a# X0 ~9 e8 p- B. [+ w2 s, @/ l7 b6 _+ j
. |# c# l2 F* q) [
& N- ]# [' T. x8 D% p3 r
* O* i5 S3 k3 }4 R7 p) Y# g, ^) M

& a# {! j" i) R( D7 w4 [% Q( \7 \4 V: x9 ?' H

* y9 W& T3 W1 `2 }; a( x1 G% F9 \* }+ T9 u7 x6 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 20:40 , Processed in 0.056197 second(s), 19 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!