cncml手绘网

标题: HTML5 服务器发送事件(Server-Sent Events) [打印本页]

作者: admin    时间: 2018-9-4 18:54
标题: HTML5 服务器发送事件(Server-Sent Events)
HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。! n9 Y. i% a+ d7 z% F" z! D

" g/ m5 [- c; }2 c' d
: i6 ^6 o) b" X4 ?5 F
Server-Sent 事件 - 单向消息传递
Server-Sent 事件指的是网页自动获取来自服务器的更新。
以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。
例子:Facebook/Twitter 更新、股价更新、新的博文、赛事结果等。

5 |6 i( Y" B" j  E( V( {+ I* N
接收 Server-Sent 事件通知
EventSource 对象用于接收服务器发送事件通知:
  1. var source=new EventSource("demo_sse.php");
    ! |& S0 D& Z! ?, A
  2. source.onmessage=function(event)$ @! _$ O, V: W4 _+ q+ v2 E
  3. {& U6 ~9 V) @# e. O3 z; `- r- `& d5 q  o
  4.     document.getElementById("result").innerHTML+=event.data + "<br>";. ~7 e" I8 n; O  o
  5. };
复制代码
实例解析:

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

  1. if(typeof(EventSource)!=="undefined")' z5 H! [$ ^2 I
  2. {6 ?/ V2 @% n/ ^7 A/ r
  3.     // 浏览器支持 Server-Sent7 y, b2 S, b. |+ e6 g
  4.     // 一些代码.....
    ) f: u  T, o/ _4 W9 O/ {9 P
  5. }0 k0 T; {! k' l0 Z  X' N
  6. else
    # r4 _, i+ D; M7 c
  7. {
    ' K5 N, `" B9 p, t+ m
  8.     // 浏览器不支持 Server-Sent..
    ; x: O! Z( {1 L; ]' @( X
  9. }
复制代码

服务器端代码实例
为了让上面的例子可以运行,您还需要能够发送数据更新的服务器(比如 PHP 和 ASP)。
服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为 "text/event-stream"。现在,您可以开始发送事件流了。
  1. <?php
    ! U0 K2 C7 `2 }- b
  2. header('Content-Type: text/event-stream'); ) S2 N2 z0 E3 z6 H: A) k1 i- ]( Y
  3. header('Cache-Control: no-cache');
    ' u' A/ A* E' \( [: X; ?# m
  4. 2 @. Z: H9 j4 ?/ ~+ H% ]
  5. $time = date('r');
    6 v2 X7 ?' ]7 V
  6. echo "data: The server time is: {$time}\n\n";
    0 `8 [) U; B# b9 z9 t/ N
  7. flush(); ; y! U. j2 D: ^$ b
  8. ?>
复制代码
ASP 代码 (VB) (demo_sse.asp):
  1. <%, _2 y! m4 m! V2 f
  2. Response.ContentType="text/event-stream"
    + T+ s& D( Q+ j& u
  3. Response.Expires=-1, Q" K& @1 `6 J/ w; i+ A# ~
  4. Response.Write("data: " & now())
    $ x+ H* U$ ~% G3 d9 r
  5. Response.Flush()
    2 Z8 M8 V. q$ j* E* p4 |6 N8 G' P
  6. %>
复制代码
代码解释:

EventSource 对象
在上面的例子中,我们使用 onmessage 事件来获取消息。不过还可以使用其他事件:
事件
描述
onopen当通往服务器的连接被打开
onmessage当接收到消息
onerror当发生错误
- f- |; `4 P# j. l
4 ~2 a" w  H3 N/ P7 T

' h9 |0 T0 ~* M* m& o. G' {3 X7 x" L# [9 Y

4 F" G* D# f5 V' j$ H
! B8 T# F' r0 l9 x( ]0 S0 T4 k9 V; i+ A
2 D2 r5 T4 F  |6 |" S. S8 G
3 e+ Z' D# }. `& v5 n4 M  z+ M7 P! M2 L

5 l. n, e( `& I) B4 y6 T




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2