对于学校作业,我正在尝试使用 Ruby 和套接字库创建一个简单的 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>'
显然,我做错了什么,因为预期的行为是将传入的请求作为响应发送回来。
我错过了什么?