后端更新时将数据发送到前端[重复]
Posted
技术标签:
【中文标题】后端更新时将数据发送到前端[重复]【英文标题】:Send data to front end when back end updates [duplicate] 【发布时间】:2012-01-29 15:49:04 【问题描述】:我的 Web 应用程序的后端接收来自多个客户端的更新。发生此类更新时,应将其传达给所有其他客户端。
当我的后端更新时,如何从服务器向所有 Web 浏览器客户端发起更新?
我正在使用 JBoss、JSF 和 Spring 框架。
【问题讨论】:
一个小评论,虽然 Spring 本身是一个很棒的框架,但 JBoss 可能不需要它,因为它已经包含与 Spring 直接重叠的技术(例如 EJB 和 CDI)。 【参考方案1】:查看类似的堆栈溢出问题:WebSockets vs. Server-Sent events/EventSource
我假设,正如 DarthVader 所做的那样,您的前端是某种(通常)无状态的 html 页面。浏览器里的东西。如果您希望所有客户端都自动推送更改,您有以下三种选择:
Comet:(已弃用)Comet 本质上是在发出没有请求超时限制的 AJAX 请求。您提出请求,它就坐在那里并根据需要通过它流式传输数据。这可以通过隐藏的 iFrame 或标准 XMLHTTPRequest(jQuery 可以为您包装)来完成。您可以阅读有关此方法的更多信息here。
长轮询: 本质上,您使用 javascript setInterval 方法不断轮询您的服务器以进行更改。只需设置一个向服务器执行标准 AJAX GET 请求的时间间隔,每次成功后,相应地更新您的页面。
浏览器 API
HTML5 WebSockets 使用任何类型的基于事件的后端(Twisted、EventMachine、node.js 等)使WebSockets 成为理想的解决方案。只需让所有客户端在后端注册,并在任何给定客户端提交后,将更改推送到所有其他客户端。您可以在this page 上阅读更多(并查看一个很好的示例)WebSockets。浏览器支持 => canIuse
Server-sent event (SSE) 使用server-sent events,服务器可以随时通过向网页推送消息来向网页发送新数据。这些传入的消息可以被视为网页内的事件+数据。 浏览器支持 => canIuse
【讨论】:
【参考方案2】:当您说前端时,您是在谈论无状态 http 客户端。
您不能将任何内容从您的 Web 服务器推送到 http 或无状态客户端。
如果使用从前端到后端的异步调用,定期执行此操作的“技巧”。
想想 gmail,当您收到一封新电子邮件时,您认为它如何显示您有一封电子邮件。您不断浏览,向 gmail 服务器发送异步调用,如果有新消息,它就会显示它。
所以客户端是无状态的。使用 Ajax。
这清楚吗?
【讨论】:
【参考方案3】:有几种方法可以解决这个问题。未来应该遵循Websockets等标准
现在你被Comet 卡住了,它本质上是向服务器发送一个请求并保持它打开(不是发出响应结束的信号)并且只是通过它流式传输数据(停放他们称之为的请求)。或定期轮询,您只需在每个预定义的时间间隔向服务器发出 AJAX 请求,以询问服务器是否有新内容要说。不用说,第一个解决方法需要服务器和浏览器都支持流式传输,但在大多数情况下效率更高。
【讨论】:
以上是关于后端更新时将数据发送到前端[重复]的主要内容,如果未能解决你的问题,请参考以下文章
AJAX/jQuery 在提交时将前端用户输入作为 NULL 发送到 MYSQL。有啥解决办法吗? (SpringMVC、Eclipse、JSP)