【问题标题】:Running a loop (such as one for a mock webserver) within a thread在线程中运行循环(例如用于模拟网络服务器的循环)
【发布时间】:2010-03-02 02:36:40
【问题描述】:

我正在尝试在一个类的线程中运行一个模拟网络服务器。我已经尝试将类的@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 上终止

【问题讨论】:

  • 发布一些代码示例可能有助于阐明您要完成的工作
  • 希望澄清

标签: ruby multithreading oop


【解决方案1】:

在您发布的代码中,您没有调用 Server#run。这可能只是发帖时的疏忽。 Server.accept 应该阻塞一个线程,只有当有人连接时才返回。

任何以聪明的眼光开始编写 HTTP 服务器的人很快就会发现让其他人来完成这项工作会更有趣。对于快速而肮脏的 HTTP 服务器,我在 WEBrick 的帮助下取得了很好的效果。它是 Ruby 库的一部分。这是一个 WEBrick 服务器,它将提供“嘘!”当您将浏览器连接到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

【讨论】:

  • 我现在已经可以工作了,但是现在的问题是我必须在命令提示符下向它传递一行输入,以便它在等待我时将任何排队的输出发送到套接字提供输入。
  • @bob c,这是重要的信息。您可能希望将其添加到问题中。
【解决方案2】:

我不知道 ruby​​,但看起来 server.accept 在您获得 tcp 连接之前一直处于阻塞状态...一旦连接被接受,您的线程就会继续。

您应该在主线程中启动服务器,然后为您接受的每个连接生成一个新线程,这样您的服务器将立即接受另一个连接,您的线程将为刚刚接受的连接提供服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2015-08-09
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多