当然我知道Ajax,但Ajax的问题是浏览器应经常轮询服务器以查找是否有新数据。这会增加服务器负载。
除了经常轮询服务器之外,还有更好的方法(甚至使用Ajax)吗?
答案 0 :(得分:69)
是的,您正在寻找的是COMET http://en.wikipedia.org/wiki/Comet_(programming)。要搜索的其他优秀Google术语是AJAX-push和reverse-ajax。
答案 1 :(得分:36)
是的,它被称为反向Ajax 或 Comet 。 Comet基本上是一个总称,用于打开长期HTTP请求的不同方式,以便将数据实时推送到Web浏览器。我推荐StreamHub Push Server,他们有一些很酷的演示,比其他任何服务器都更容易上手。查看Getting Started with Comet and StreamHub Tutorial以获取快速介绍。您可以使用可免费下载的Community Edition,但仅限20个并发用户。商业版非常适合单独支持,另外还有SSL和Desktop .NET& Java客户端适配器。可以通过Google Group获得帮助,网上有很多教程,也有GWT Comet adapter。
答案 2 :(得分:29)
现在你应该使用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
};
服务器端处理取决于您的技术堆栈。
答案 3 :(得分:10)
关注Comet(Ajax是一个清洁代理,而Comet也是如此),这基本上是“反向Ajax”。请注意,这需要为每个用户提供长期服务器连接以接收通知,因此请在编写应用程序时注意性能影响。
答案 4 :(得分:6)
答案 5 :(得分:5)
另一种标准方式是SSE (Server-Sent Events, also known as EventSource,在JavaScript对象之后。)
答案 6 :(得分:5)
Comet的一个有趣的替代方案是在Flash中使用套接字。
答案 7 :(得分:5)
我强烈建议在Comet上投入一些时间,但我不知道你可以使用的实际实现或库。
对于Web应用程序的一种“callcenter控制面板”,它涉及更新现场Callcenter的代理和呼叫队列状态,我们开发了一个可行的内部解决方案,但远离您可以使用的库。
我们所做的是在与电话系统通信的服务器上实施小型服务,等待新事件并维护情况照片。此服务提供了一个小型网络服务器。
我们的网络客户端通过HTTP连接到此网络服务器并要求提供最后一张照片(以XML格式编码),显示它然后再次请求新照片。此时的网络服务器可以:
这样,当客户端轮询时,它会在最多0到30秒内得到响应。如果已经生成了一个新事件,则立即获取它,否则它将阻塞直到生成新事件。
它基本上是轮询,但它有点聪明的轮询,不会使网络服务器过热。如果Comet不是您的答案,我相信这可以使用相同的想法实现,但使用更广泛的AJAX或JSON编码以获得更好的结果。这是在AJAX之前的时代设计的,因此还有很大的改进空间。
如果有人可以提供实际的轻量级实现,那就太棒了!
答案 8 :(得分:4)
Comet实际上是由来自Dojo Toolkit(http://www.dojotoolkit.org)的Alex Russell创造的。以下是更多信息http://cometdproject.dojotoolkit.org/
的链接答案 9 :(得分:2)
您可以在服务器端使用BlazeDS或LiveCycle在客户端上使用Flash / Flex应用程序。可以使用RTMP连接将数据推送到客户端。请注意,RTMP使用非标准端口。但是,如果端口被阻止,您可以轻松地回退到轮询。
答案 10 :(得分:2)
可能值得查看Meteor Server这是为COMET设计的Web服务器。很好demo,它也被twitterfall使用。
答案 11 :(得分:2)
通过使用持久的http连接,可以实现您的目标。
在维基百科上查看Comet article,这是一个很好的起点。
你没有提供太多信息,但如果你正在寻找建立某种事件驱动的网站(a'la digg spy)或类似的东西你可能会考虑实现一个隐藏的IFRAME连接到连接永远不会关闭的URL,然后您将脚本标记从服务器推送到客户端以执行更新。
答案 12 :(得分:2)
还有其他方法。不确定他们在你的情况下是否“更好”。您可以在页面加载时连接到服务器的Java小程序,并等待服务器发送的内容。它在启动时会慢一点,但会允许浏览器不经常轮询从服务器接收数据。
答案 13 :(得分:1)
你可以尝试我们的Comet Component - 尽管它非常实验......!
答案 14 :(得分:1)
请检查此库https://github.com/SignalR/SignalR以了解如何在客户端可用时动态地将数据推送到客户端
答案 15 :(得分:1)
一旦连接打开到服务器,它就可以保持打开状态,服务器可以在很久以前使用multipart/x-mixed-replace
推送内容,但这在IE中不起作用。
我认为你可以通过轮询来做一些聪明的事情,通过不发送内容不变的标题,但保持连接打开但是我从来没有这样做,它更像是推送。
答案 16 :(得分:0)
也可能想看ReverseHTTP。
答案 17 :(得分:0)
如果您使用的是jsp页面,也可以查看Java Pushlets。