我使用TCPServer
在Ruby中实现了一种非常简单的服务器。我有Server
类serve
方法:
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
有什么可疑的事吗?
感谢任何答案,因为我没有更多的地方可以看......
答案 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