[英]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.