javascript聊天客户端的服务器轮询间隔

nic*_*ckf 11 javascript ajax

我正在为我的网站构建一个基本的小AJAX shoutbox/chat,但我不确定如何实现服务器轮询.

这是我正在考虑的基本程序流程:

  1. 用户进入页面并显示最后10条消息
  2. 要获取其他人发送的消息,客户端javascript将请求带有timestamp参数的URL(设置为客户端收到的最后一条消息的值)
  3. 服务器返回自该时间戳以来的所有消息(最多10个).

唯一的问题是轮询服务器的频率.显然,每次添加新消息时都应该进行轮询,但是当您只是阅读其他消息时,它需要自动更新.

它应该是一个设定的时间限制吗?例如:每10秒钟.或者,它会根据使用情况而有所不同吗?例如:5秒后检查.如果没有消息,请不要再检查10秒.如果仍然没有新消息,请检查15秒,然后是20,最多可能每30秒检查一次.每次检测到新消息时,都会将计时器重置为5秒并重新开始.

考虑到我们可以在线同时拥有数百名用户,我只关心在服务器上施加不必要的压力.

......或者我弄错了什么?有没有更好的方法来实现基本的JavaScript聊天?

Bri*_*ell 5

您可能希望研究一下所谓的Comet编程技术,将信息流式传输给用户,而不是让客户端轮询服务器.这实际上是一系列技术,其中一些可能比其他技术更好,具体取决于具体情况,例如您使用的是哪种服务器以及您需要哪种类型的客户端兼容性.

如果您的服务器一次可以处理大量打开的连接(例如,它不使用每个连接的整个线程或进程,例如nginx或基于erlang的服务器),您可能希望使用长轮询技术,一旦收到一条消息,客户端立即请求另一条消息.如果没有可用消息,则服务器只是保持连接打开,可能偶尔发送虚拟数据作为保持连接,直到消息可用.


lev*_*vik 4

Brian 描述的 Comet 是一项很好的技术,但需要服务器上的会话支持,这可能比您想要实现的简单聊天框更先进。

实现轮询间隔的最佳方法是想象您有一个聊天窗口,您可以最小化该窗口以执行其他操作,或者打开该窗口以查看是否有新消息。当您正在进行对话时,您会经常切换到该对话(轮询)。如果你有一段时间没有收到任何消息,你就会开始变得越来越稀少,直到你偶尔查看一下。

假设您不需要进行实时打字,您可以在活动高峰时每 3 秒左右轮询一次,如果 5-10 次轮询没有任何结果,则开始增加间隔(也许每次都加倍) )直到达到 30-60 秒。获取消息应将轮询间隔重置回几秒,而发送消息应立即轮询,但可能不需要影响轮询的频率。