我的Web应用程序的后端接收来自多个客户端的更新。发生此类更新时,应将其传达给所有其他客户。
如何更新后端,如何从服务器向所有Web浏览器客户端发起更新?
我正在使用JBoss,JSF和Spring框架。
答案 0 :(得分:7)
请参阅类似的堆栈溢出查询:WebSockets vs. Server-Sent events/EventSource
我假设,正如DarthVader所做的那样,你的前端是某种(通常)无状态的HTML页面。浏览器中的东西。如果您希望自动推送所有客户端,则有三个选项:
Comet :(已弃用)
Comet实际上是在发出没有请求超时限制的AJAX请求。您发出请求,它就在那里并根据需要通过它传输数据。这可以使用隐藏的iFrame或标准XMLHTTPRequests(jQuery可以为您包装)来完成。您可以阅读有关此方法的更多信息here。
长轮询:
实际上,您使用javascript setInterval方法不断轮询服务器以进行更改。只需设置一个间隔,对服务器执行标准的AJAX GET请求,并在每次成功时相应地更新您的页面。
浏览器API
<强> HTML5 WebSockets 强>
使用任何类型的基于事件的后端(Twisted,EventMachine,node.js等)使WebSockets成为理想的解决方案。只需让所有客户注册后端,并在任何给定客户提交后,将更改推送给所有其他客户。您可以在this page上阅读更多(并查看一个很好的示例)WebSockets。浏览器支持=&gt; canIuse
<强> Server-sent event (SSE) 强>
使用server-sent events,服务器可以随时将新数据发送到网页,方法是将消息推送到网页。这些传入的消息可以被视为网页内的事件+数据。
浏览器suppport =&gt; canIuse
答案 1 :(得分:2)
当你说前端时,你正在谈论无状态的http客户端。
您无法将任何内容从您的网络服务器推送到http或无状态客户端。
如果使用从前端到后端的异步调用,定期执行此操作的“技巧”。
考虑一下gmail,当你收到一封新邮件时,你认为它显示你收到了一封电子邮件。你浏览器很容易,发送Asynch调用gmail服务器,如果有新消息,它会显示它。
所以客户是无国籍的。使用Ajax。
这是清楚的吗?
答案 2 :(得分:0)
有几种方法可以解决这个问题。未来的方式应遵循Websockets
等标准现在你仍然坚持使用Comet,这实际上是向服务器发送请求并保持打开状态(不发出响应结束信号),只是通过它传输数据(停放他们称之为的请求)。或定期轮询,您只需在每个预定义的时间间隔内向服务器发出一个AJAX请求,询问服务器是否有新的要求。毋庸置疑,首次解决方案需要在服务器和浏览器上提供流媒体支持,但在大多数情况下都更有效。