ソケットからの読み取りと、Unicorn や Mongrel などの Ruby サーバーでの読み取りに関する 2 つの質問があります。
- ソケットから読み取ることはファイルを読み取ることとは異なり、送信される明確な EOF メッセージはなく、データは無限のストリームであることを学びました。では、読むのをやめるタイミングはどうすればわかりますか? たとえば、この場合の私のTCPServerは
http://localhost:9799
、ブラウザからアクセスしてサーバーにアクセスすると、読み取るデータがなくなった後にハングし、EOFErrorもスローされません。
require 'socket'
READ_CHUNK = 1024
socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM)
addr = Socket.pack_sockaddr_in(9799, '127.0.0.1')
socket.bind(addr)
socket.listen(Socket::SOMAXCONN)
socket.setsockopt(:SOCKET, :REUSEADDR, true)
puts "Server is listening on port = 9799"
loop do
connection, addr_info = socket.accept
data_buffer = ""
loop do
begin
connection.read_nonblock(READ_CHUNK, data_buffer)
puts "Buffer = #{data_buffer}"
rescue Errno::EAGAIN => e
IO.select([connection])
retry
rescue EOFError
break
end
end
connection.write("HTTP/1.1 200 \r\n")
connection.write("Content-Type: text/html\r\n")
connection.write("Status 200 \r\n")
connection.write("Connection: close \r\n")
connection.write("Hello World \r\n")
connection.close
end
Ruby サーバーで使用されるベスト プラクティス/標準的なアプローチを知りたいです。Unicorn はkgioライブラリの read_nonblock を使用し、mongrel は readpartial を使用していることがわかります (これらについてはよくわかりませんが、コードを調べてみると、これが採用されたアプローチであると私は感じています)。入力が完了しました。これがどのように行われるべきかを説明できます(そして、それはアプローチではないと思いますgets
-その、、、read
)。readpartial
read_nonblock
2)。ユニコーンやパッセンジャーなどのサーバーでこれがどのように達成されるかについて、数行教えていただければ幸いです。
ありがとうございました。