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