Ruby TCPServer有时无法工作

时间:2015-01-04 15:44:39

标签: ruby sockets rspec server tcpserver

我使用TCPServer在Ruby中实现了一种非常简单的服务器。我有Serverserve方法:

def serve
    # Do the actual serving in a child process
    @pid = fork do
      # Trap signal sent by #stop or by pressing ^C
      Signal.trap('INT') { exit }

      # Create a new server on port 2835 (1 ounce = 28.35 grams)
      server = TCPServer.new('localhost', 2835)
      @logger.info 'Listening on http://localhost:2835...'

      loop do
        socket = server.accept
        request_line = socket.gets

        @logger.info "* #{request_line}"

        socket.print "message"

        socket.close
      end
    end
  end

stop方法:

def stop
    @logger.info 'Shutting down'
    Process.kill('INT', @pid)
    Process.wait
    @pid = nil
end

我从命令行运行我的服务器,使用:

if __FILE__ == $0
  server = Server.new
  server.logger = Logger.new(STDOUT)
  server.logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
  begin
    server.serve
    Process.wait
  rescue Interrupt
    server.stop
  end
end

问题在于,有时候,当我从终端执行ruby server.rb时,服务器会启动,但当我尝试在localhost:2835上发出请求时,它会失败。只有在几次请求后才开始提供某些页面。在其他情况下,我需要再次停止/启动服务器,以便正确地提供页面。为什么会这样?难道我做错了什么?我发现这很奇怪......

同样的事情适用于我的规格:我有一些规格定义,以及一些水豚规格。在每次测试之前,我创建一个服务器并启动它,并在每次测试后停止服务器。问题仍然存在:测试有时会通过,有时会因为找不到请求的页面而失败。

我的fork有什么可疑的事吗?

感谢任何答案,因为我没有更多的地方可以看......

1 个答案:

答案 0 :(得分:0)

您的代码不是HTTP服务器。它是一个TCP服务器,它发送字符串" message"收到换行符后在套接字上。

您的代码不是有效的HTTP服务器的原因是它不符合HTTP protocol。 HTTP协议的许多要求之一是服务器使用

形式的消息进行响应
HTTP/1.1 <code> <reason>

<code>是一个数字,而<reason>是一个人类可读的状态&#34;,就像&#34; OK&#34;或者&#34;服务器错误&#34;或类似的规定。字符串message显然不符合此要求。

以下是如何在ruby中构建HTTP服务器的简单介绍:https://practicingruby.com/articles/implementing-an-http-file-server