Ruby tcpserver клиентский сервер - PullRequest
2 голосов
/ 21 марта 2011

У меня есть приложение, которое я кодирую, чтобы информация о журнале отправлялась через tcpsocket на сервер, а клиент монитора подключался к серверу для просмотра данных журнала.Пока я в состоянии добраться до стадии, когда информация отправляется на сервер, но мне нужно немного подумать о том, как перейти к следующему этапу.Используя Ruby tcpsever, какие методологии можно использовать, чтобы сервер повторно отправлял входящие данные клиенту?Как я могу хранить данные в разных потоках?

require "socket"  

server_socket = TCPServer.new('localhost', 2200)  

loop do  
  # Create a new thread for each connection.
  Thread.start(server_socket.accept) do |session|

    # check if received is viewer request
    line = session.gets
    if line =~ /viewer/
      @filter = line[/\:(.*?)\:/]
      session.puts "Listining for #{filter}"

      loop do
        if (log = ### need input here from logging app ###)
          # Show if filter is set for all or cli matches to filter
          if @filter == ':all:' || log =~ /\:(.*?)\:/
            session.puts log
          end

          # Read trace_viewer input. 
          if session.gets =~ /quit/
            # close the connections
            session.puts "Closing connection. Bye!"
            session.close
            break
          end
        end
      end
    end
  end  
end

1 Ответ

0 голосов
/ 21 марта 2011

Для клиентов, подключающихся к серверу, это звучит как типичная конфигурация клиент / сервер: одни клиенты отправляют данные, а другие запрашивают их.Есть ли какая-то причина, по которой вы не используете стандартный HTTP-клиент / сервер, то есть веб-сервер, вместо того, чтобы изобретать велосипед?Используйте Sinatra, Padrino или даже Rails, и вы в основном закончите.

Как мне хранить данные между потоками?

Модуль потоков Ruby включает Queue, что хорошо для перемещения данных между потоками.На странице документа есть пример, который должен помочь.

Те же идеи использования очереди применимы и к использованию таблиц.Я бы рекомендовал использовать базу данных в качестве очереди для вашего использования, а не делать это в памяти.Отключение питания или сбой приложения приведет к потере всех данных, если они находятся в очереди в памяти, а клиенты не получили все данные.Запись и чтение базы данных означает, что данные пережили бы такие проблемы.

Сохраняйте схему простой, предоставьте разумный индекс для нее, и она должна быть достаточно быстрой для большинства применений.Вам понадобится некоторый служебный код для поддержания чистоты базы данных, но это легко сделать с помощью SQL или ORM, например, Sequel или ActiveRecord.

...