簡體   English   中英

Ruby TCPServer有時無法工作

[英]Ruby TCPServer fails to work sometimes

我已經在Ruby中使用TCPServer實現了一種非常簡單的服務器。 我有一個帶有serve方法的Server類:

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出事了嗎?

希望得到任何答案,因為我沒有更多的地方可以看...

您的代碼不是HTTP服務器。 它是一個TCP服務器,在接收到換行符后通過套接字發送字符串“ message”。

您的代碼不是有效的HTTP服務器的原因是,它不符合HTTP協議 HTTP協議的許多要求之一是服務器以以下形式的消息響應

HTTP/1.1 <code> <reason>

其中<code>是數字,而<reason>是人類可讀的“狀態”,例如“ OK”或“ Server Error”或類似的內容。 字符串message顯然不符合此要求。

以下是有關如何在ruby中構建HTTP服務器的簡單介紹: https : //practicingruby.com/articles/implementing-an-http-file-server

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM