Как я могу взаимодействовать с веб-приложением Sinatra через сокет Unix?

#ruby #ajax #sinatra

#ruby #ajax #sinatra

Вопрос:

Я пишу веб-приложение с использованием Sinatra на встроенном устройстве, и мне нужно иметь возможность отправлять и получать данные через сокет Unix встроенному коду, запущенному на том же устройстве. Скорее всего, мы будем использовать JSON для формата данных, но я не нашел примера, который действительно иллюстрировал бы, как это настроить и взаимодействовать с веб-приложением.

Я ищу как пример кода, который будет прослушивать сокет, так и пример, показывающий, как перенести эти данные на веб-страницу Sinatra. Я видел фрагменты обоих, но ничего, что связывало бы концепции вместе.

Ответ №1:

Я не делал этого лично, но я знаю, что Event Machine поддерживает работу с сокетом unix. Преимущество event machine в том, что вы можете заставить код прослушивать сокет, не «вмешиваясь» в работу веб-сервера sinatra. Таким образом, вы можете, например, прослушивать сокет для получения некоторой статистики, сохранять эти статистические данные в памяти, а затем возвращать их клиентам по HTTP-запросам.

И если вы собираетесь использовать EventMachine, я предлагаю использовать в качестве веб-сервера thin, который реализован поверх него, поэтому вам не нужно запускать его вручную.

Комментарии:

1. Похоже, это может сработать. Итак, в принципе, есть прослушиватель, который сохраняет любые данные, которые он получает, в соответствующую переменную, и запросы AJAX будут обращаться к этому?

Ответ №2:

Я никогда не делал этого лично, но Unicorn может прослушивать сокеты unix и обслуживать приложения Sinatra.

Ответ №3:

Файл app.rb :

 #!/usr/bin/env ruby                            

require 'sinatra'

SOCKET_PATH = File.expand_path('tmp/app.sock')

class App < Sinatra::Base
  set :server, :thin
  set :bind, SOCKET_PATH

  get '/' do
    'Welcome'
  end
end

if __FILE__ == $0
  App.run!
end
  

Выполнить: $ ruby app.rb

Gemfile:

 source 'https://rubygems.org'
gem 'thin'
gem 'sinatra'