以“gmail.com”为例,其中新邮件显示为以及何时到达用户的收件箱。据我了解,触发器来自更新用户收件箱页面的数据库/网络服务器。
任何人都可以建议更新动态网页的代码是什么[假设 Gmail 帐户页面是由类似 Servlet 的技术生成的] 无需刷新且无需从客户端发出明确请求(请不要考虑 XHR 将请求发送到服务器固定间隔,因为这也将来自客户端)。
它可以通过涉及 XHR 的 AJAX 代码实现吗?如果可以,那么如何实现?
以“gmail.com”为例,其中新邮件显示为以及何时到达用户的收件箱。据我了解,触发器来自更新用户收件箱页面的数据库/网络服务器。
任何人都可以建议更新动态网页的代码是什么[假设 Gmail 帐户页面是由类似 Servlet 的技术生成的] 无需刷新且无需从客户端发出明确请求(请不要考虑 XHR 将请求发送到服务器固定间隔,因为这也将来自客户端)。
它可以通过涉及 XHR 的 AJAX 代码实现吗?如果可以,那么如何实现?
我认为目前执行此操作的常用方法是使用“长轮询”,也称为Comet。有各种具体的技术,但基本思想是浏览器向服务器发送请求,服务器只是保持连接打开,直到它有东西要发送给浏览器。例如,在 Gmail 上,浏览器应用程序可能会立即请求收件箱中的下一封新邮件,而服务器可能会等待半小时再发送,因为这是新邮件实际到达收件箱所需的时间。
从技术上讲,这仍然是客户端驱动的,但客户端的“请求”实际上只是为服务器提供了在其选择的未来时间向客户端发送数据的机会。
当您使用长轮询时,您的服务器将有大量待处理的请求大部分时间处于空闲状态。 Servlet API 的第 3 版引入了“异步支持”,它允许线程暂停请求并在第一个请求等待时处理其他请求。为较旧的 API 版本编写的 Servlet 无法很好地扩展,因为该service()
方法在产生响应之前不能返回,因此它必须占用一个线程,等待响应时间。或者,Tomcat 有一个针对 Comet 的特殊扩展,它允许一个 servlet 使用事件驱动的 I/O 在同一个线程上同时处理多个请求;其他 servlet 容器可能会提供类似的扩展。
有一种称为WebSockets的新协议允许通过持久连接进行双向通信,而无需 HTTP 开销,但它尚未得到广泛支持。
可以使用 ajax 或 Web 套接字来完成。
使用 Ajax,您可以通过长时间轮询来实现这一点,而这正是现在大多数大人物正在做的事情。Web 套接字是未来,但支持很差。如果你在 node.js 环境中运行,socket.io 非常适合这种东西,但是,也有适用于 ruby 和 php 的选项。
socket.io 之类的工具的美妙之处在于您将能够使用 Web 套接字,它会在不可用的情况下降级为 ajax 长轮询,从而保持您的功能完好无损。
使用 Comet 时,您还可以使用来自 servlet api 3.0 的新Asynchonous servlet - 那时不需要用于 tomcat 的彗星扩展。
我目前认为有 4 种方法可以做到这一点:
有关更多详细信息,您可以查看此博客文章,该文章还介绍了 Servlet 3.0 和 Spring MVC 3.2 中的异步支持。