Падрино && веб-сокеты

я ищу способ открыть и использовать веб-сокеты из приложения Padrino. я знаю, что Padrino работает с одним потоком, но я ищу способ открывать веб-сокеты и обмениваться переменными между его методами «onopen», «onclose», «onmessage» и контроллерами Padrino.

есть идеи как это делается?

ссылки, которые я просмотрел:

Примеры использования Eventmachine с Padrino и Sinatra (только У меня работал Sinatra) em-websocket на GitHub

ОБНОВЛЕНИЕ 1: это мой main.rb:

    require 'rubygems'      # <-- Added this require
require 'em-websocket'
require 'padrino-core'
require 'thin'

require File.expand_path("../config/boot.rb", __FILE__)

SOCKETS = []
EventMachine.run do     # <-- Changed EM to EventMachine
#  class App < Sinatra::Base
#      get '/' do
#          SOCKETS.each {|s| s.send "fooooo"}
#          return "foo"
#      end
#  end

  EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8080) do |ws| # <-- Added |ws|
      # Websocket code here
      ws.onopen {
          ws.send "connected!!!!"
          SOCKETS << ws
      }

      ws.onmessage { |msg|
          puts "got message #{msg}"
          ws.send "ECHO: #{msg}"
      }

      ws.onclose   {
          ws.send "WebSocket closed"
          SOCKETS.delete ws
      }

  end

  # You could also use Rainbows! instead of Thin.
  # Any EM based Rack handler should do.
  #App.run!({:port => 3000})    # <-- Changed this line from Thin.start to App.run!
  Thin::Server.start Padrino.application, '0.0.0.0', 3000

конец

я получаю это исключение:

/home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/thin-1.2.11/lib/thin/daemonizing.rb:2:in `require': no such file to load -- daemons (LoadError)
    from /home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/thin-1.2.11/lib/thin/daemonizing.rb:2:in `<top (required)>'
    from /home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/thin-1.2.11/lib/thin/server.rb:50:in `<class:Server>'
    from /home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/thin-1.2.11/lib/thin/server.rb:48:in `<module:Thin>'
    from /home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/thin-1.2.11/lib/thin/server.rb:1:in `<top (required)>'
    from main.rb:39:in `block in <main>'
    from /home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call'
    from /home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
    from /home/cstore/.rvm/gems/ruby-1.9.2-p290@runtime/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
    from main.rb:9:in `<main>'

ОБНОВЛЕНИЕ 2: Решено благодаря Натану! Я только что добавил «демонов» в Gemfile и перезагрузил приложение.


person refaelos    schedule 21.09.2011    source источник
comment
Попробуйте добавить в Gemfile: gem 'daemons' Обычно эта ошибка означает, что указанный гем либо не установлен в вашем гемсете, либо отсутствует в Gemfile.   -  person Nathan    schedule 21.09.2011
comment
Для справки, строка, генерирующая это исключение, просто пытается загрузить библиотеку демонов: github.com/macournoyer/thin/blob/v1.2.1/lib/thin/   -  person Nathan    schedule 21.09.2011
comment
я добавил этот драгоценный камень. не сработало .... я просто попробовал еще раз, и это сработало. Бог работает таинственным образом :) БОЛЬШОЕ СПАСИБО !!!   -  person refaelos    schedule 21.09.2011


Ответы (4)


Возможно, вам нужно установить демонов:

Отредактируйте свой Gemfile:

# Adding this
gem 'daemons'

Установите недостающие драгоценные камни:

$ bundle install
person DAddYE    schedule 21.09.2011
comment
Да, или просто попробуйте добавить в Gemfile: gem 'daemons', а затем запустите bundle install - person Nathan; 21.09.2011

Что конкретно из этого примера: https://github.com/igrigorik/em-websocket и Любой успех с Sinatra, работающим вместе с EventMachine WebSockets? не работал с Падрино, но работал с Синатрой? Можете ли вы объяснить ошибки, которые вы получили, и почему эти примеры не удались (трассировки стека)? Может, мы сможем помочь в расследовании.

person Nathan    schedule 21.09.2011

Я наткнулся на этот пост, и он мне немного помог, но я хотел предложить альтернативное решение всем, кто мог бы наткнуться на него. Я решил просто напрямую изменить config.ru и смонтировать приложение websocket-rack.

Вот мой config.ru, где WSApp является подклассом Rack::WebSocket::Application и находится в каталоге lib/ (поэтому Падрино загружает его автоматически):

#!/usr/bin/env rackup
# encoding: utf-8

# This file can be used to start Padrino,
# just execute it from the command line.

require File.expand_path("../config/boot.rb", __FILE__)

# Setup routes
map '/' do
  run Padrino.application
end
map '/ws' do
  run WSApp.new
end
person joslinm    schedule 26.10.2012

Поскольку сейчас это самый популярный поиск в Google, я хотел бы связать его с padrino-websockets, чистый DSL для написания веб-приложений в Padrino.

person Darío    schedule 28.04.2014