如何根据其他客户端(在rails中)发出的请求更新网页?

时间:2016-11-23 14:38:20

标签: ruby-on-rails websocket

这是我的需要: 我必须从网页上显示一些信息 Web浏览器实际上位于同一台计算机上(localhost) 我希望服务器计划动态更新数据。

由于HTTP协议实际上是一个请求/响应协议,我知道要获得此功能,服务器和客户端(这里是本地的)之间的连接应该以某种方式保持打开(Websocket,Server-Sent Events)等等。)

是的,“实时”现在真的是时尚潮流,有很多框架可以做到这一点(流星等......)

事实上,除了使用Websockets(Rails 4中的服务器发送事件和Rails 5中的ActionCable)外,Rails似乎也支持此功能。 因此,实现这一功能并不是什么大问题,我猜......

然而,我真正想要的是触发另一个客户提出的请求更新网页(在本地显示)..

这张照片将更好地解释:

Update from another client

  1. 开始时,浏览器连接到(本地)服务器 (绿色箭头)
    我想在执行所有会话数据(实例变量)的地方执行一个线程 为了使用某些“实时”机制,连接保持打开状态,因此 线程Y 不会终止。 (我想这就是它的工作原理)
  2. 第二个用户正在将 (蓝色箭头) 连接到服务器(可能是或不是同一个网页)并进行一些操作(例如发布表单) )。
    这里对该外部客户端的响应无关紧要。只需一个HTTP OK 响应即可。但也可以返回确认网页 但无论如何, 主题X (和/或连接)没有特别的理由保留。
  3. 好的,这是我的问题(顺便说一句,谢谢你到目前为止看我) 如何在本地Web浏览器上回显这些新数据?

    我看到了两种不同的方法:

    • 路径A:在终止之前, 主题X 将数据(其实例变量)传递给 主题Y 其连接仍然打开。因此,服务器能够更新Web浏览器。
    • 路径B:在终止 线程X之前 使用特定套接字直接向Web浏览器发送请求(我的意思是响应,因为它是服务器)。 / LI>

    我应该在两种方法中使用哪种机制来实现这种功能? 对于方法A,如何在线程之间交换数据? 对于方法B,我如何使用已打开的套接字?

    但是这两种方法(或另一种)中的哪一种实际上是最好的方法呢?

    再次感谢你为我读到目前为止,并为我糟糕的英语感到抱歉 我希望我已经足够清楚地表明了我的需要。

1 个答案:

答案 0 :(得分:3)

你正在思考这个问题。没有必要考虑线程和套接字等低级机制。大多数(所有?)pub-sub实时更新工具(ActionCable,faye等)按照"渠道"和"事件"。

所以,你的流程将如下所示:

  1. 客户端A(网络浏览器)向您的服务器发出请求,并订阅来自频道"客户端事件" (或者其他的东西)。

  2. 客户端B(另一个浏览器)向服务器发出请求,要求将事件发布到频道"客户端事件"。

  3. Pub-sub库有其神奇之处。

  4. 客户端A获取更新并相应地更新UI。

  5. 查看此简介指南:Action Cable Overview