学校の課題で、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/
(1回だけ)接続すると、次のようになります。
Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1
これは のような補助ファイルを要求している Chromiumfavicon.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>'
明らかに、期待される動作は着信要求を応答として送り返すものだったので、何か間違ったことをしています。
私は何が欠けていますか?