Выполнение цикла (например, цикла для фиктивного веб-сервера) в потоке - PullRequest
0 голосов
/ 02 марта 2010

Я пытаюсь запустить фиктивный веб-сервер в потоке внутри класса. Я попытался передать свойство класса @server в блок потока, но как только я попытаюсь сделать server.accept поток останавливается. Есть ли способ сделать эту работу? Я хочу, чтобы в основном я мог запускать веб-сервер из этого скрипта, все еще принимая пользовательский ввод через stdin.gets. Возможно ли это?

class Server
    def initialize()
        @server = TCPServer.new(8080)
    end
    def run()
        @thread = Thread.new(@server) { |server|
            while true
                newsock = server.accept
                puts "some stuff after accept!"
                next if !newsock
                # some other stuff
            end
        }
    end
end
def processCommand()
    # some user commands here
end
test = Server.new
while true do
  processCommand(STDIN.gets)
end

В приведенном выше примере нить умирает на server.accept

Ответы [ 2 ]

0 голосов
/ 02 марта 2010

Я не знаю ruby, но похоже, что server.accept блокируется до тех пор, пока вы не установите соединение tcp ... ваш поток будет продолжен, как только соединение будет принято.

Вы должны запустить сервер в своем основном потоке, а затем создать новый поток для каждого соединения, которое вы принимаете, таким образом, ваш сервер немедленно перейдет к принятию другого соединения, и ваш поток будет обслуживать только что принятое соединение. *

0 голосов
/ 02 марта 2010

В коде, который вы разместили, вы не называете Server # run. Это, вероятно, просто недосмотр в создании поста. Предполагается, что Server.accept блокирует поток, возвращаясь только тогда, когда кто-то подключился.

Любой, кто приступает к написанию HTTP-сервера со светлыми глазами, вскоре узнает, что гораздо интереснее позволить кому-то еще делать эту работу. Для быстрых и грязных HTTP-серверов у меня есть хорошие результаты с помощью WEBrick. Это часть библиотеки Ruby. Вот сервер WEBrick, который будет обслуживать "Boo!" Когда вы подключаете браузер к localhost:8080/:

#!/usr/bin/ruby1.8

require 'webrick'

class MiniServer

  def initialize
    Thread.new do
      Thread::abort_on_exception = true
        server = WEBrick::HTTPServer.new(:BindAddress=>'127.0.0.1',
                                         :Port=>8080,
                                         :Logger=>WEBrick::Log.new('/dev/stdout'))
        server.mount('/', Servlet, self)
        server.start
    end
  end

  private

  class Servlet < WEBrick::HTTPServlet::AbstractServlet

    def initialize(webrick_server, mini_server)
    end

    def do_GET(req, resp)
      resp.body = "<html><head></head><body>Boo!</body></html>"
    end
    alias :do_POST :do_GET

  end

end

server = MiniServer.new
gets
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...