如何将数据从sinatra应用程序中的类传递到websocket机架



我在一个sinatra应用程序中有一个websocket机架的工作配置,该应用程序用于多屏幕的物理安装。有一些功能可以很好地在网络套接字中来回传递消息。

我的问题是:我有一个页面有一个标准的web表单(即不是websocket表单),我的目标是从该表单中收集params,将params转换为字符串变量,然后通过websocket将该变量(字符串)的内容发送到另一个页面/屏幕。就我的生活而言,我不知道如何做一项相对简单的任务,因为从我的应用程序中的主类来看,我无法与我的Socket类通信,据我所知,它基本上是一个机架应用程序。

我试图通过建立resque作为中间人来解决这个问题,但很快发现我的问题没有改变。我不知道如何从另一个类调用一个方法和/或将变量传递给Socket,以便它推送到浏览器。

基本上,我有一个app.rb,它是这样的:

    module SomeThing
      class App < Sinatra::Base
        get '/' do
          #show a form
        end
        post '/submit' do
          #receive params
          #save params
          new_message = params.inspect
          #dream up some way to pass new_message to websocket
        end
        post '/otherscreen' do
          #have an open websocket to receive new_message
        end
      end

      class Socket < Rack::WebSocket::Application
        def on_open(env)
          puts "Client connected"
          send_data "Oh hai!"
        end
        def on_close(env)
          puts "Client disconnected"
        end
        def on_message(env, msg)
           puts "Received message from client: " + msg
        end
        def on_error(env, error)
          puts "An error occured: " + error.message
        end
        def pass_message(env, new_message)
          send_data new_message
        end
      end   
    end

如果你需要更多信息来解决这个问题,请告诉我。我很乐意提供所需的一切,只是不确定现在可能是什么。

你知道我该怎么解决吗?它要了我的命。

提前感谢!

所以,我写信给websocket rack的作者Bernard Potocki,他说:

"我通常所做的是将活动连接的列表保存到某种类变量。一种可能的实现可能如下所示:https://gist.github.com/imanel/a00d6b65561ebba43b9a"

要点的内容,以防被删除:

class Socket < Rack::WebSocket::Application
  def self.connections
    @connections ||= []
  end
  def self.send_to_all(message)
    @connections.each {|connection| connection.send_data(message)
  end
  def on_open(env)
    self.class.connections << self
  end
  def on_close(env)
    self.class.connection.delete(self)
  end
end

然而,最终,我没有测试这个解决方案,因为我们能够使用Redis和Event Machine解决这个问题,所以请注意,这也是一个选项。

相关内容

  • 没有找到相关文章

最新更新