为了完成学校作业,我正在尝试使用Ruby和sockets库创建一个简单的HTTP服务器。
目前,我可以让它回应任何连接并简单地打印“hello”:
require 'socket'
server = TCPServer.open 2000
puts "Listening on port 2000"
loop {
client = server.accept()
resp = "Hello?"
headers = ["HTTP/1.1 200 OK",
"Date: Tue, 14 Dec 2010 10:48:45 GMT",
"Server: Ruby",
"Content-Type: text/html; charset=iso-8859-1",
"Content-Length: #{resp.length}\r\n\r\n"].join("\r\n")
client.puts headers
client.puts resp
client.close
}
这个代码按照预期工作。但是,当我要求服务器告诉我刚刚连接的用户时
puts "Client: #{client.addr[2]}"
当我使用Chromium(浏览器)连接到localhost:2000/
时(仅一次),我收到以下信息:
Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1
我认为这是Chromium请求辅助文件,例如favicon.ico
,而不是我的脚本执行了一些奇怪的操作,因此我想调查一下传入的请求。我用以下代码替换了resp = "Hello?"
行:
resp = client.read()
我重新启动了服务器。在Chromium中重新发送请求后,它没有立即返回,而是一直卡住了。同时,在我的服务器输出中,我得到了Client: 127.0.0.1
。我按下了Chromium中的"停止"按钮,然后服务器崩溃了。
server.rb:16:in `write': Broken pipe (Errno::EPIPE)
from server.rb:16:in `puts'
from server.rb:16:in `block in <main>'
from server.rb:6:in `loop'
from server.rb:6:in `<main>'
显然,我做错了什么,因为期望的行为是将传入的请求作为响应发送回去。
我漏掉了什么?