簡體   English   中英

如何從sinatra應用程序中的類將數據傳遞到websocket機架?

[英]How can I pass data to websocket-rack from a class in my sinatra app?

我在sinatra應用程序中有一個websocket-rack的工作配置,該應用程序用於具有多個屏幕的物理安裝。 有一些功能可以正常工作,通過網絡套接字來回傳遞消息。

我的問題是:我有一個帶有標准Web表單(即不是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機架的作者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解決此問題,因此請注意,這也是一個選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM