有没有办法将数据从Web服务器推送到浏览器?

时间:2008-08-21 14:04:56

标签: ajax webserver comet

当然我知道Ajax,但Ajax的问题​​是浏览器应经常轮询服务器以查找是否有新数据。这会增加服务器负载。

除了经常轮询服务器之外,还有更好的方法(甚至使用Ajax)吗?

18 个答案:

答案 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”。请注意,这需要为每个用户提供长期服务器连接以接收通知,因此请在编写应用程序时注意性能影响。

http://en.wikipedia.org/wiki/Comet_(programming)

答案 4 :(得分:6)

彗星绝对是你想要的。根据您的语言/框架要求,可以使用不同的服务器库。例如,WebSync is an IIS-integrated comet server for ASP.NET/C#/IIS developers,如果您需要与其他语言更紧密地集成,还有许多其他独立服务器。

答案 5 :(得分:5)

另一种标准方式是SSE (Server-Sent Events, also known as EventSource,在JavaScript对象之后。)

答案 6 :(得分:5)

Comet的一个有趣的替代方案是在Flash中使用套接字。

答案 7 :(得分:5)

我强烈建议在Comet上投入一些时间,但我不知道你可以使用的实际实现或库。

对于Web应用程序的一种“callcenter控制面板”,它涉及更新现场Callcenter的代理和呼叫队列状态,我们开发了一个可行的内部解决方案,但远离您可以使用的库。

我们所做的是在与电话系统通信的服务器上实施小型服务,等待新事件并维护情况照片。此服务提供了一个小型网络服务器。

我们的网络客户端通过HTTP连接到此网络服务器并要求提供最后一张照片(以XML格式编码),显示它然后再次请求新照片。此时的网络服务器可以:

  • 如果有新照片
  • ,则返回新照片
  • 阻止客户端几秒钟(在我们的设置中为30秒)等待某些事件发生并改变照片。如果此时没有生成任何事件,它将返回相同的照片,仅允许连接保持活动状态而不会使客户端超时。

这样,当客户端轮询时,它会在最多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