Sinatra 流媒体和 Eventmachine 频道

Posted

技术标签:

【中文标题】Sinatra 流媒体和 Eventmachine 频道【英文标题】:Sinatra Streaming and Eventmachine Channels 【发布时间】:2012-02-26 20:20:13 【问题描述】:

使用 Sinatra Streaming,有一种方法可以指定哪些连接获得发送信息。例如,仅特定帐户上的用户。

我相信这可以使用 Eventmachine Channels 来完成,但我不知道如何。任何建议甚至更好的示例代码都将不胜感激。

以下是代码的相关部分。现在你可以看到它只是发送到每个打开的连接。

configure do
    set server: 'thin', connections: []
    set :app_file, __FILE__
    set :port, ENV['PORT']
    set :public_folder, File.dirname(__FILE__) + '/public'
end

get '/stream', provides: 'text/event-stream' do
    stream :keep_open do |out|
        settings.connections << out
        out.callback  settings.connections.delete(out) 
    end
end

post '/update/contact/:id' do
    @contact = Contact.get(params[:id])
    @contact.update(params[:contact])
    settings.connections.each  |out| out << "data: #@contact.account_id Contact #@contact.id #@contact.first_name #@contact.last_name\n\n" 
    204
end

【问题讨论】:

我现在确实在为同样的事情苦苦挣扎。 @codefor5 我面临着类似的技术挑战,您能否发布您使用的解决方案。 【参考方案1】:

您可以使用条件。在您的情况下,您可以使用 Sinatra 自述文件中提供的授权示例,并拥有两个完全相同的具有不同授权的路由。这样,如果第一个条件失败,它将检查第二个路由,然后应该流式传输。可能有一种单路解决方案,但尚未尝试过流式传输。

【讨论】:

谢谢 - 我想我明白了。你能通过发布我修改过的代码来澄清一下吗? BTY - 我正在使用授权。这些帐户有个人帐户和个人用户。我只想在同一帐户的用户之间传输信息。 我想我给出了错误的答案...如果用户被授权,请检查条件下的自述文件以获取一条路线 (github.com/sinatra/sinatra/blob/master/README.rdoc) 那应该可以。您可以根据自己的身份验证系统设置自己的条件。 我不确定我是否清楚。每个登录的人都有一个开放的连接,并且可以正常工作。如何仅发送给该人的联系人或特定人群的联系人,而不是发送给所有有联系人的人?

以上是关于Sinatra 流媒体和 Eventmachine 频道的主要内容,如果未能解决你的问题,请参考以下文章

使用 EventMachine 和 RabbitMQ 的 RPC

EventMachine 和 em-websocket - 从队列中读取并推送到通道

安装eventmachine(1.0.3)时出错[重复]

无法在 Rails 控制台中加载 Ruby EventMachine - 没有要加载的文件

EventMachine WebSockets - 订阅 WS 到 EM 频道与保持套接字收集

EventMachine/em-http-request 检测 http 流连接何时停止