Web 服务器响应传入的 HTTP 请求而工作……处理请求并返回 HTTP 响应。在这种架构中,服务器是否可以向客户端推送数据……例如,来自客户端 1 的请求并且服务器想要通知客户端 2?它显然可以由一个非网络服务器使用套接字来完成,但是一个必须支持页面请求并允许推送数据的网络服务器应用程序呢?
4 回答
如果您不介意等待网络世界赶上这个新兴标准,您可以使用像Jetty这样支持Web Sockets的网络应用程序容器。然后您将拥有真正的双向通信,而不是 HTTP + 轮询或特殊插件等。
一个必须支持页面请求并允许推送数据的网络服务器应用程序怎么样?
Servlet 3.0 引入了异步支持,允许编写 Comet 风格的应用程序(即使用长寿命 HTTP 连接和长轮询或流式传输的应用程序)。
如果您等不及 Servlet 3.0 Async 支持并且不想使用来自容器(如 GlassFish、Jetty)的专有 Comet 或 WebSocket 支持,请查看Atmosphere。
也可以看看
另一种可能性是滥用 HTTP Keep Alive 来实现这一点。有关一些背景信息,请参阅http://en.wikipedia.org/wiki/HTTP_persistent_connection。在您的场景中,您将client2
启动与服务器的连接,然后该服务器将保持打开状态以侦听通知。
这不是一个很好的解决方案,首先您需要保持大量长期存在的 TCP 连接,如果连接丢失,服务器将无法重新连接。它必须等待客户回来。
不,不是没有一些客户端技术(Flash、Silverlight、Applet 等)
不过,您可以让页面使用 AJAX 轮询服务器。