分享

CometD JavaScript 传输

 phoneone 2011-11-16

原文地址:

                  http:///documentation/cometd-javascript/transports

 

CometD JavaScript 传输

 

 

sbordet 提交于星期三,2009/7/29-13:09

 

 

JavaScript CometD 传输

 

 

Bayeux 规范定义了两个强制性传输过程:

long-polling(长轮询)

callback-polling(回调轮询)

 

 

JavaScript CometD 实现完全支持这两个传输过程。

 

 

最新的浏览器 (例如,火狐 3.5)使用长轮询传输也可以跨域Bayeux通信,请参阅下面的跨域模式。

 

 

长轮询传输

 

 

长轮询传输是默认传输。

该传输被用于在同一个域,和跨域模式下与 Bayeux 服务器发生通信(见下文)。

通过简单的XMLHttpRequest(内容类型的text/jsonPOST请求)调用将数据发送到服务器。

 

 

回调轮询传输

 

 

回调轮询传输是与 Bayeux 服务器在不同域发生通信时使用的传输 (当不支持跨域模式时,见下文的跨域模式章节)。

 

 

当到一个不同域去下载脚本时,众所周知XMLHttpRequest的调用是被限制的。(请参阅下面替代的跨域模式解决方案)。

为了克服起始地址的限制,此传输使用 JSONP 脚本注入:而不是使用注入src 属性指向 Bayeux 服务器的<script>元素的XMLHttpRequest

浏览器会注意到脚本元素注入并执行 GET 请求到指定源的 URL

Bayeux 服务器是意识到这是一个 JSONP 请求并答复由浏览器执行的JavaScript 函数(并在 JavaScript Cometd 现实中回调)。

 

 

在使用此传输中有三个主要缺点:

这个传输是啰嗦的。

这是因为,浏览器按顺序执行注入的脚本,直到脚本已完全"下载"或它无法执行。

例如,假设一个脚步注入是涉及长轮询的通信,或是为了发布一条消息。浏览器注入长轮询脚本,要求 Bayeux 服务器上,但 Bayeux 服务器保存请求等待服务器端事件 (这样的"脚本"未有"下载)"。浏览器注入长轮询脚本,Bayeux 服务器有了一个请求,但是Bayeux 服务器要留着这个请求以等待服务器事件(所以“脚本”没有“下载”)。然后,浏览器注入发布脚本,那个被服务器留着的请求被回复 (所以“脚本”完成“下载”)。不管怎么样,浏览器没有执行第二个脚本,因为没有执行第一个脚本(从它没有完成“下载”)。在这些条件下:在长轮询返回后,发布仅仅执行一次。为了避免Bayeux 服务器有情况,在使用回调轮询传输的情况下,为每条从客户端来的消息使用客户端长轮询,这就是为什么传输是啰嗦的: 长轮询通常频繁返回。

消息大小是有限的。

支持 IE7是必须,IE7 GET 请求具有2083字符限制。

对故障的反应较慢。

这是因为,如果脚本注入的 URL返回的是错误 (例如 Bayeux 服务器已关闭),会被浏览器忽略。

 

 

跨域模式

 

 

火狐 3.5 介绍了XMLHttpRequest可以在不同域调用的能力(请看火狐 3.5文档)。

 

 

在版本 1.0.0.rc0中, JavaScript CometD 实现也支持它,不需要在客户端上进行配置 (如果浏览器支持客户端跨域调用,它们将会被使用) 但需要在服务器上做一点配置。请参阅本文档的服务器配置。

 

 

要使用跨域模式,您需要:

一跨域兼容浏览器 (例如 Firefox 3.5

一兼容服务器 (例如:配置了CrossOriginFilterjetty

 

 

使用这个程序,与 Bayeux 服务器的跨域通信,推荐使用长轮询传输,避免回调轮询传输的弊端。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多