Java web-server 应用程序有没有办法推送?

Posted

技术标签:

【中文标题】Java web-server 应用程序有没有办法推送?【英文标题】:Do Java web-server apps have any way to PUSH? 【发布时间】:2010-06-02 12:23:35 【问题描述】:

Web 服务器响应传入的 HTTP 请求...处理请求并返回 HTTP 响应。在这种架构中,服务器是否可以向客户端推送数据……例如,来自客户端 1 的请求并且服务器想要通知客户端 2?这显然可以由非网络服务器使用套接字来完成,但是对于必须支持页面请求并允许推送数据的网络服务器应用程序呢?

【问题讨论】:

【参考方案1】:

一个必须支持页面请求并允许推送数据的网络服务器应用程序呢?

Servlet 3.0 引入了异步支持,允许编写 Comet 风格的应用程序(即使用长寿命 HTTP 连接和 long pollingstreaming 的应用程序)。

如果您等不及 Servlet 3.0 Async 支持并且不想使用来自容器(如 GlassFish、Jetty)的专有 Comet 或 WebSocket 支持,请查看Atmosphere。

另见

JavaOne 2008: Comet (AJAX, Grizzly and Cometd) Asynchronous processing support in Servlet 3.0 Servlet 3.0 Async API or Atmosphere? A Simple Comparison

【讨论】:

WebSockets 不是专有的。它们是标准轨道。 @JUSTMYcorrectOPINION:Jetty API 专有的,Resin API 专有的。因此,正如我所写的那样,容器支持是专有的。这就是为什么会有 Atmosphere。 嘿,气氛看起来很有趣。 @JUST:你错过了一点:Java 上的 WebSocket 支持在 Java EE API 中没有定义。所以你依赖于使用的容器。然而,它确实是 W3C html5 标准。 是的,在阅读了 Pascal 的回复后,我发现了 @BalusC。 支持是专有的,而不是机制。【参考方案2】:

如果您不介意等待网络世界赶上这一新兴标准,您可以使用支持 Web Sockets 的网络应用容器,例如 Jetty。然后您将拥有真正的双向通信,而不是 HTTP + 轮询或特殊插件等。

【讨论】:

听起来很酷,但是有浏览器支持吗?除了 Jetty 还有其他网络服务器吗? Chrome 支持它。我认为火狐可以。 IE可以通过一个简单的 Flash 代理来支持它(仍然比 AJAX 和各种 Comet 技巧更简单)。服务器端,我不知道。 Tomcat 肯定不支持,但是因为我用的是 Geronimo+Jetty,所以不在乎。【参考方案3】:

不,不是没有一些客户端技术(Flash、Silverlight、Applet 等)

您可以让页面使用 AJAX 轮询服务器。

【讨论】:

轮询是显而易见的答案,但如果每个客户端都不断发送“他们是否有任何更新我应该被告知”,那么对性能的影响有多大?请求? @John - 无法真正回答。这完全取决于您轮询的频率、您拥有多少客户以及处理每个请求的成本。它必须是您根据您的应用体验随时间调整的内容。【参考方案4】:

另一种可能性是滥用 HTTP Keep Alive 来实现这一点。有关一些背景信息,请参阅http://en.wikipedia.org/wiki/HTTP_persistent_connection。在您的场景中,您将让 client2 启动与服务器的连接,然后该服务器将保持打开状态以侦听通知。

这不是一个很好的解决方案,首先你需要保持大量长期存在的 TCP 连接,如果连接丢失,服务器将无法重新连接。它必须等待客户端回来。

【讨论】:

以上是关于Java web-server 应用程序有没有办法推送?的主要内容,如果未能解决你的问题,请参考以下文章

NGROK + WEB-SERVER + NODE.JS + WEBSOCKET + NPM

分布式事务产生场景

有没有办法从 Visual Studio Code 调试 Tomcat Java 应用程序

无法远程连接mysql,连接后也没有权限创建数据库

Java应用程序有没有办法获得root权限?

如何在 Go Web-Server 和 Vue.js 前端之间交换数据? http-post : 404