我当然知道Ajax,但是Ajax的问题是浏览器应该经常轮询服务器以查找是否有新数据。这会增加服务器负载。
除了频繁轮询服务器之外,还有什么更好的方法(甚至使用Ajax)吗?
我当然知道Ajax,但是Ajax的问题是浏览器应该经常轮询服务器以查找是否有新数据。这会增加服务器负载。
除了频繁轮询服务器之外,还有什么更好的方法(甚至使用Ajax)吗?
Answers:
是的,您正在寻找的是COMET http://en.wikipedia.org/wiki/Comet_(programming)。要搜索的其他优质Google术语是AJAX-push和reverse-ajax。
是的,它叫做Reverse Ajax或Comet。Comet基本上是总括性术语,用于表示打开长期HTTP请求以将数据实时推送到Web浏览器的不同方式。我建议使用StreamHub Push Server,它们有一些不错的演示,并且比其他任何服务器都更容易上手。查看《Comet和StreamHub入门指南》以获取快速介绍。您可以使用社区版,该社区版可免费下载,但仅限20个并发用户。仅提供支持就值得使用商业版本,此外,您还可以获得SSL以及Desktop .NET和Java客户端适配器。可通过Google网上论坛获得帮助,网上有很多教程,还有GWT Comet适配器。
现在,您应该使用WebSockets。这是2011年的标准,允许使用HTTP发起连接,然后将其升级为基于双向客户端-服务器消息的通信。
您可以通过javascript轻松启动连接:
var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt)
{
var message = evt.data;
//decode message (with JSON or something) and do the needed
};
服务器端处理取决于您的技术堆栈。
研究Comet(它是Ajax是清洁剂的事实的欺骗,Comet也是如此),它基本上是“反向Ajax”。请注意,这要求每个用户都有长寿命的服务器连接才能接收通知,因此在编写应用程序时请注意性能影响。
彗星绝对是您想要的。根据您的语言/框架要求,有不同的服务器库可用。例如,WebSync是面向ASP.NET/C#/IIS开发人员的IIS集成的彗星服务器,如果您需要与其他语言进行更紧密的集成,则还有很多其他独立服务器。
我强烈建议您花一些时间在Comet上,但是我不知道您可以使用的实际实现或库。
对于Web应用程序的某种“呼叫中心控制面板”,其中涉及为实时Callcenter更新代理和呼叫队列状态,我们开发了一种内部解决方案,该解决方案可以工作,但与您可以使用的库相距甚远。
我们要做的是在与电话系统进行对话的服务器上实现一项小型服务,等待新事件并维护情况的照片。该服务提供了一个小型Web服务器。
我们的Web客户端通过HTTP连接到该Web服务器,并索要最后一张照片(以XML编码),将其显示,然后再次查找新照片。此时,Web服务器可以:
这样,当客户端进行轮询时,它将在最多0到30秒内得到响应。如果已经生成了新事件,它将立即获取它),否则它将阻塞直到生成新事件。
它基本上是轮询,但是它有点聪明,不会使Web服务器过热。如果Comet不是您的答案,我相信可以使用相同的想法来实现,但是可以使用更广泛的AJAX或JSON编码以获得更好的结果。这是在AJAX时代之前设计的,因此还有很多改进的空间。
如果有人可以提供这种方法的实际轻量级实现,那就太好了!
另一种标准方式是SSE(服务器发送事件,也称为 JavaScript对象之后的EventSource)。
彗星实际上是由Dojo Toolkit(http://www.dojotoolkit.org)的Alex Russell创造的。这是更多信息的链接http://cometdproject.dojotoolkit.org/
通过使用持久的http连接,可以实现您的目标。
在Wikipedia上查看Comet文章,这是一个不错的起点。
您提供的信息不多,但是如果您正在考虑构建某种事件驱动的网站(a'la digg spy)或类似的东西,您可能会希望实现与之连接的隐藏IFRAME一个连接永不关闭的URL,然后您将脚本标记从服务器推送到客户端以执行更新。
值得一看的Meteor Server是为COMET设计的Web服务器。不错的演示,twitterfall也使用它。
请检查此库https://github.com/SignalR/SignalR以了解如何在数据可用时将其动态推送到客户端
如果您正在使用jsp页面,也可以查看Java Pushlets。
可能还想看看ReverseHTTP。