2

複数の画面を備えた物理的なインストールを目的としたsinatraアプリで、websocket-rackの動作構成を取得しました。メッセージが Websocket を介して正常にやり取りされる機能があります。

私の問題はこれです: 標準の Web フォーム (つまり、websocket フォームではない) を含むページが 1 つあり、私の目標は、そのフォームからパラメーターを収集し、パラメーターを文字列変数に変換してから、その変数の内容を送信することです (文字列) を websocket を介して別のページ/画面に送信します。私の人生では、アプリのメインクラスからソケットクラスと通信できないため、比較的単純なタスクを行う方法を理解できません。これは、私が理解していることから、基本的にラックアプリ。

resque を仲介者として設定して解決しようとしましたが、問題が変わっていないことがすぐにわかりました。メソッドを呼び出したり、変数を別のクラスからソケットに渡したりして、ブラウザにプッシュする方法がわかりません。

基本的に、次のような 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

これを解決するためにさらに情報が必要な場合はお知らせください。必要なものは何でも提供させていただきますが、現時点で何が必要かはわかりません。

どうすればこれを解決できるか知っていますか? それは私を殺している。

お早めにどうぞ!

4

1 に答える 1

1

そこで、websocket-rack の作者である Bernard Potocki に手紙を書いたところ、彼は次のように述べています。

「私が通常行っているのは、アクティブな接続のリストをある種のクラス変数に保存することです。可能な実装の 1 つは、この要点のようになります: 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 を使用してこの問題を解決できたため、最終的にはこのソリューションをテストしませんでした。そのため、それもオプションであることに注意してください。

于 2013-02-20T22:16:36.243 に答える