4

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

具体我想回答的问题是 -

  1. 我如何在JavaScript中检测到连接已经 成功建立。例如。如果我要使用脚本标记 长查询方法,并且浏览器永远无法访问服务器, 我该怎么知道?
  2. 当长时间轮询时,如果服务器没有响应,则浏览器最终会进入“请求超时”状态。 如何在Javascript中检测到并重新建立长期民意调查?
  3. 如何确保我的技术可以跨浏览器使用?基本上我想要 知道正确的方法组合(脚本标签,xhr等), 覆盖大多数浏览器。

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

谢谢。

+0

这些都是人们一直试图回答的大问题。祝你好运! – Kristian 2012-03-10 21:40:08

回答

1

以下是我公司如何解决这些问题:

1)如果你可以让没有立即收到一个错误的连接,你还挺有假设已建立连接。如果你没有立即收到答复(不好或不好),你只需要假设它正在工作......这使得一些强大的客户端客户端,所以智能地使用序列ID很重要。

2)马上再试一次。通常服务器会在客户端执行前超时,并发送一个错误代码,告诉您发生了什么。只要确保在服务器端使用类似20秒的合理轮询时间即可。

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

瑞恩·达尔(node.js的创造者),有一个非常简单的聊天客户端/服务器实现的位置:https://github.com/ry/node_chat

祝你好运!

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

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

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

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

谢谢。