Comet的客户端技术

时间:2012-03-10 21:36:32

标签: javascript javascript-events comet javascript-framework server-push

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

具体而言,我想回答的问题是 -

  1. 如何在JavaScript中检测到连接已经存在 成功建立。例如。如果我要使用脚本标记 长轮询方法,浏览器永远无法访问服务器, 我怎么知道?
  2. 当长轮询时,如果服务器没有响应的话 浏览器最终会陷入“请求超时”状态。怎么样 在Javascript中检测到这一点并重新建立长轮询?
  3. 如何确保我的技术适用于各种浏览器?基本上我想要 要知道正确的方法组合(脚本标签,xhr等) 覆盖大多数浏览器。
  4. 我尝试寻找Comet框架,但我找到的每个框架(CometD,Atmosphere)等都带有服务器端实现,并使客户端交易对用户透明。然而,我试图找出他们如何实现客户端专长。我有自己的服务器实现和协议。

    感谢。

2 个答案:

答案 0 :(得分: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

祝你好运!!

答案 1 :(得分:1)

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

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

  3. 测试就是答案。传输的组合依赖于浏览器应用程序和服务器应用程序的环境。例如,如果您将支持IE6但不支持跨域连接和移动设备,则无需使用长轮询传输。使用WebSocket,Server-Sent Events和HTTP Streaming传输就足够了,如果您没有能力准备WebSocket服务器,那么正确的传输将是Server-Sent Events和Streaming。

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

    感谢。