[英]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.