无需轮询或捎带将服务器端更新发送到浏览器

Posted

技术标签:

【中文标题】无需轮询或捎带将服务器端更新发送到浏览器【英文标题】:Sending Server side updates to Browser without polling or piggybacking 【发布时间】:2012-04-07 12:45:09 【问题描述】:

我正在尝试在没有客户端(浏览器)请求更新的情况下将数据从服务器推送到客户端。

我的应用程序基于 JBoss 服务器上的 JSF2.0(带有 JSP)和 RF3.3。

我已经浏览了许多链接来尝试了解如何实现它。 长轮询、piggybacking、服务器端轮询等术语我都懂。

我猜它可以使用 COMET 和大气来完成(我认为它不适用于 JBoss),但我不确定是否相同。主要问题是我几乎想不出一个起点,因为我在网上找不到任何类型的代码教程或演示代码。

此外,起点本身并不是很清楚,我应该从哪里开始,以及在实现所需功能的过程中我需要什么。

谁能指导我这个话题。我对这个话题很迷茫。

一般用例场景是用户正在浏览我的应用程序中的某个网页,突然我需要在页面上发出通知或更新一个值,而无需用户发出相同的请求。

【问题讨论】:

你看过网络套接字吗? 是的..但我不知道从哪里开始... @ta.speot.is 你能指导我从哪里开始并实现它的演示...... 【参考方案1】:

如果您愿意使用 RF 4.0.X,这里有一个示例说明如何使用 ajax 推送。你可以在这里找到一个例子

http://anonsvn.jboss.org/repos/richfaces/branches/4.0.0.CR1/examples/push-demo/src/main/webapp/chat.xhtml
http://anonsvn.jboss.org/repos/richfaces/branches/4.0.0.CR1/examples/

如果您必须坚持使用 RF 3.3,您可以在此处找到相关示例作为起点

http://anonsvn.jboss.org/repos/richfaces/branches/community/3.3.X/samples/

【讨论】:

您能否在哪里可以找到您提到的 RF3.3.X 链接上的相关数据【参考方案2】:

RF4.2 确实使这变得非常简单,但我发现如果您不想要 RichFaces,通过 jQuery 轮询一个特殊的 servlet 也同样有效。

// javascript part
jQuery.ajax(
    url : "/poll?sessionKey=" + sessionKey,
    dataType : "text",
    success : function(data) 
        // ... Do your thing to depending on the contents of data.
    ,
    error : function(xhr, ajaxOptions, thrownError) 
        // ... Oops, something went wrong.
    
);

// Server part
@WebServlet(urlPatterns = "/poll")
public class pollServlet implements Servlet 

轮询非常便宜,您可以每隔几秒钟进行一次,而不会产生太大影响。另一个好处是您可以监控浏览器窗口是否仍然打开。

【讨论】:

甚至可以从 RF3.3 使用 直接进行轮询......但我试图避免轮询..使用轮询我已经做到了,但它非常昂贵。 是的,这就是我使用 jQuery 解决方案的原因。这完全绕过了昂贵的 JSF 循环,因此非常便宜。 因此,您认为使用您在帖子中提供的解决方案,我可以将数据从服务器推送到网页,而无需浏览器请求更新??...您也可以解释一下原因为什么使用 轮询如此便宜..还有你在哪里指定轮询间隔??..在成功和错误函数中究竟可以做什么..我可以在成功函数内更新网页中存在的组件基于特定条件?

以上是关于无需轮询或捎带将服务器端更新发送到浏览器的主要内容,如果未能解决你的问题,请参考以下文章

轮询长轮询comet长连接SSEwebsocket

轮询长轮询comet长连接SSEwebsocket

从后端异步更新/通知 HTML,无需 AJAX 轮询

轮询或不轮询(在 Web 服务上下文中)

服务端向客户端推送消息:轮询,长轮询(兼容性好),以及websocket(主流浏览器都支持)

后端更新时将数据发送到前端[重复]