5

ソケットからの読み取りと、Unicorn や Mongrel などの Ruby サーバーでの読み取りに関する 2 つの質問があります。

  1. ソケットから読み取ることはファイルを読み取ることとは異なり、送信される明確な 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)。readpartialread_nonblock

2)。ユニコーンやパッセンジャーなどのサーバーでこれがどのように達成されるかについて、数行教えていただければ幸いです。

ありがとうございました。

4

1 に答える 1