Server-Sent Events(翻译)

原文:http://www.w3.org/TR/eventsource/  

  该文档是w3c标准push机制的翻译。

摘要

  该规范定义了一套API,它开启一个HTTP连接,以DOM事件的形式收到从服务器端发来的通知。设计这个API的目的是它能够被扩展,使其能和其他push通知机制一起工作,就像Push SMS一样。

1、介绍

  该文档是非规范的。

  该规范介绍了EventSource接口,它使服务器能够通过HTTP或者专用的server-push协议来讲数据push到网页端。

  用这个API创建一个EventSource对象,注册一个事件监听。

  

var source = new EventSource('updates.cgi');
source.onmessage = function (event) {
  alert(event.data);
};

  在服务器端,脚本(在这个例子中是updates.cgi)用下面的形式来发送消息,用text/event-stream MIME类型:

data: This is the first message.

data: This is the second message, it
data: has two lines.

data: This is the third message.

   作者能够通过不同的事件类型将事件分开。下面是有两种事件类型的流,add和remove:

event: add
data: 73857293

event: remove
data: 2153

event: add
data: 113411

  处理这样的流,脚本需要这样写:

var source = new EventSource('updates.cgi');
source.addEventListener('add', addHandler, false);
source.addEventListener('remove', removeHandler, false);

  其中,addHandler和removeHandler是带一个参数的函数。

  缺省的事件类型是message。

  用HTTP正常的请求,HTTP301和307重定向请求,事件流可以被重定向。如果连接关闭,客户端会重连接;通过HTTP204没有内容回应代码,客户端能被告知停止重连接。

  用这个API而不是用XMLHttpRequest或者一个iframe来模拟它,能够允许用户代理更好地利用网络资源,在很多情况下,用户代理实现和网络操作是同等优先的。这个能够很好滴节省移动设备的电源。这个将在下面的无连接(connectionless) push一章还会被讨论。

2、术语

  构造一个Foo对象,Foo实际上是一个接口,更准确滴说,是一个对象实现了Foo接口。

  术语DOM

3、EventSource接口

[Constructor(DOMString url, optional EventSourceInit eventSourceInitDict)]
interface EventSource : EventTarget {
  readonly attribute DOMString url;
  readonly attribute boolean withCredentials;

  // ready state
  const unsigned short CONNECTING = 0;
  const unsigned short OPEN = 1;
  const unsigned short CLOSED = 2;
  readonly attribute unsigned short readyState;

  // networking
  [TreatNonCallableAsNull] attribute Function? onopen;
  [TreatNonCallableAsNull] attribute Function? onmessage;
  [TreatNonCallableAsNull] attribute Function? onerror;
  void close();
};

dictionary EventSourceInit {
  boolean withCredentials = false;
};

   EventSource()构造函数有一到两个参数。第一个参数是指定的要连接的URL。第二个参数指定了设置,第二个参数是可选的,如果有的话,就以EventSourceInit字典的形式。当EventSource()构造函数被调用时,用户代理(UA)必须按下面的步骤执行:

  1)解决第一个参数的URL,相当于输入脚本的base URL。

  2)如果上步失败了,则投一个SyntaxError异常。

  3)创建一个新的EventSource对象。

  4)让CORS模式是匿名的。

  5)如果第二个参数存在,并且withCredentials字典成员值是true,那么设置CORS模式为Use Credentials,初始化新的EventSource对象的withCredentials属性为true。

  6)返回新的EventSource对象,继续在后台执行这些步骤(没有阻塞脚本)。

  7)

  当脚本的全局对象或者是一个Window对象或者是一个实现WorkerUtils接口的对象时,上面的构造方式必须是可见的。

  传给构造函数的url属性必须是绝对URL。

  withCredentials属性必须返回它上次初始化的值。当对象被创建,这个属性必须被初始化为false。

  readyState属性代表了连接状态,它可以是下面的值:

  CONNECTING(数字值是0)

    连接没有被创建,或者连接被关,用户代理正在重新连接。

  OPEN(数字值是1)

    用户代理有一个连接,正在发布事件。

  CLOSED(数字值是2)

    连接没开,用户代理不试着重连接。或者是有一个重大的错误,或者是close()方法被调用。

  当对象被创建,它的readyState属性必须被设置成CONNECTING(0)。

  close()方法必须终止对于EventSource对象的fetch算法的任何实例,必须设置readyState属性为CLOSED。

  下面是event handlers(它们相关于event handler event types),这些作为IDL属性,必须被支持,需要所有对象都实现EventSource接口:

  另外,每个EventSource对象还有下面的东东:

  1、重连接时间(reconnection time),在毫秒级,这个必须最初是用户代理设定的值。

  2、上一个事件的ID字符串,这个必须初始化为空字符串。

  这些值当前是不暴露给接口的。

4、处理模型

 

  当数据被收到,被网络任务源排列的任务必须按照下面的内容处理数据。

 

5、判定一个事件流

6、解析事件流

7、注释

8、无连接push和其他features

9、垃圾回收

  

posted on 2012-07-17 11:32  亭子  阅读(518)  评论(0编辑  收藏  举报

导航