Comet 的客户端技术

Posted

技术标签:

【中文标题】Comet 的客户端技术【英文标题】:Client side technique for Comet 【发布时间】:2012-03-27 20:48:40 【问题描述】:

我正在尝试为 Comet 提供一个实用的客户端 (javascript) 实现。 http://en.wikipedia.org/wiki/Comet_(programming)) 谈到了这个理论,但我很难找到一个可行的实现。我知道这里也有很好的服务器端要求,但我只对它的客户端部分感兴趣。

具体我想回答的问题是——

    如何在 JavaScript 中检测连接已 成功成立。例如。如果我要使用脚本标签 长轮询方法,浏览器永远无法访问服务器, 我怎么知道? 长轮询时,如果服务器没有响应 浏览器最终会陷入“请求超时”状态。如何 我应该在 Javascript 中检测到这一点并重新建立长轮询吗? 如何确保我的技术适用于浏览器?基本上我想要 了解正确的方法组合(脚本标签、xhr 等) 覆盖大多数浏览器。

我尝试寻找 Comet 框架,但我找到的每个框架(CometD、Atmosphere)等都带有服务器端实现,并使客户端交易对用户透明。然而,我试图找出他们如何实现客户端的壮举。我有自己的服务器实现和协议。

【问题讨论】:

这些是人们一直试图回答的大问题。祝你好运! 【参考方案1】:

以下是我公司解决这些问题的方式:

1) 如果您可以在不立即收到错误的情况下建立连接,则您必须假设连接已建立。如果您没有立即收到响应(无论是坏的还是其他的),您只需要假设它是否正常工作......这会导致一些棘手的管家客户端,因此智能地使用序列 ID 很重要。

2) 立即重试。通常,服务器会在客户端超时并返回一个错误代码告诉您发生了这种情况。只需确保在服务器端使用合理的时间(例如 20 秒)作为轮询时间。

3) 你必须去一个不同的域名,而不是其他请求到同一服务的机器并使用 jsonp。例如,如果您的页面是从 example.com 托管的,通常会有一个 chat.example.com 子域,因为大多数浏览器一次只允许 3 或 4 个打开连接到同一个域名。由于同源策略,Jsonp 是必要的。除此之外:测试,测试,测试。

Ryan Dahl(node.js 的创建者)在这里实现了一个非常简单的聊天客户端/服务器:https://github.com/ry/node_chat

祝你好运!

【讨论】:

【参考方案2】:

    如果传输是一种长轮询,您无法知道这一点。当我在 jQuery Socket 中设计长轮询传输时,我遇到了同样的问题,因为在建立连接时套接字对象会触发 open 事件。所以我添加了一条规则,即当服务器收到第一个长轮询请求时,服务器必须立即响应,以告诉客户端服务器接受此请求并建立连接。供您参考,如果第一个长轮询请求未在指定的超时时间内完成,套接字对象将触发 close 事件。

    我同意@Hersheezy 的回答。请再试一次。

    测试就是答案。传输的组合依赖于您的浏览器应用程序和服务器应用程序的环境。例如,如果您将支持 IE6 但不支持跨域连接和移动设备,则不需要使用长轮询传输。使用 WebSocket、Server-Sent Events 和 HTTP Streaming 传输就足够了,如果您负担不起准备 WebSocket 服务器的费用,那么适当的传输将是 Server-Sent Events 和 Streaming。

我一直在制作jQuery Socket,它是一个服务器无关的 JavaScript 库,并为基于浏览器的应用程序提供了一个套接字。也许这对你有帮助。目前,它是 pre-alpha 版本,我正在编写一个涵盖服务器端处理的文档。

谢谢。

【讨论】:

以上是关于Comet 的客户端技术的主要内容,如果未能解决你的问题,请参考以下文章

Comet:基于 HTTP 长连接的“服务器推”技术

Comet反向ajax技术实现客服聊天系统

Comet:基于 HTTP 长连接的“服务器推”技术

Tomcat如何实现Comet

java 使用 comet4j 主动向客户端推送信息 简单例子

反向Ajax,实现服务器向客户端推送消息之 Comet