当然我知道Ajax,但Ajax的问题是浏览器应经常轮询服务器以查找是否有新数据.这会增加服务器负载.
除了经常轮询服务器之外,还有更好的方法(甚至使用Ajax)吗?
是的,您正在寻找的是COMET http://en.wikipedia.org/wiki/Comet_(programming).要搜索的其他优秀Google术语是AJAX-push和reverse-ajax.
是的,它被称为反向Ajax或Comet.Comet基本上是一个总称,用于打开长期HTTP请求的不同方式,以便将数据实时推送到Web浏览器.我推荐使用StreamHub Push Server,他们有一些很酷的演示,比其他任何服务器都更容易上手.查看Comet入门和StreamHub教程快速入门.您可以使用可免费下载的Community Edition,但仅限20个并发用户.商业版非常值得单独支持,另外还有SSL和Desktop .NET和Java客户端适配器.可以通过Google Group获得帮助,网上有很多教程,还有一个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".请注意,这需要为每个用户提供长期服务器连接以接收通知,因此请在编写应用程序时注意性能影响.
http://en.wikipedia.org/wiki/Comet_(programming)
彗星绝对是你想要的.根据您的语言/框架要求,可以使用不同的服务器库.例如,WebSync是ASP.NET/C#/ IIS开发人员的IIS集成彗星服务器,如果您需要与其他语言更紧密地集成,还有许多其他独立服务器.
我强烈建议在Comet上投入一些时间,但我不知道你可以使用的实际实现或库.
对于一个Web应用程序的"呼叫中心控制面板",它涉及更新现有Callcenter的代理和呼叫队列状态,我们开发了一个可行的内部解决方案,但远离您可以使用的库.
我们所做的是在服务器上实现与电话系统通信的小型服务,等待新事件并维护情况照片.此服务提供了一个小型Web服务器.
我们的网络客户端通过HTTP连接到此网络服务器,并要求提供最后一张照片(以XML格式编码),显示它然后再次请求新照片.此时的网络服务器可以:
如果有的话,请返回新照片
阻止客户端几秒钟(在我们的设置中为30)等待某些事件发生并改变照片.如果此时没有生成任何事件,则返回相同的照片,仅允许连接保持活动状态而不会使客户端超时.
这样,当客户端轮询时,它会在最多0到30秒内得到响应.如果已经生成了新事件,则立即获取它,否则它将阻塞直到生成新事件.
它基本上是轮询,但它有点聪明的轮询,不会使网络服务器过热.如果Comet不是您的答案,我相信这可以使用相同的想法实现,但使用更广泛的AJAX或JSON编码以获得更好的结果.这是在AJAX之前的时代设计的,因此有很大的改进空间.
如果有人可以提供这个实际的轻量级实现,太棒了!
Comet的一个有趣的替代方案是在Flash中使用套接字.
另一种标准方式是SSE(服务器发送事件,也称为EventSource,在JavaScript对象之后).