Ich habe einen 2 Teil Frage beim Lesen von Sockets und wie ist es geschafft, auf Ruby-Servern wie Unicorn oder MischlingsWie aus einer TCPServer Steckdose in rubin ausgelesen, readpartial und read_nonblock
- ich gelernt habe gelesen Das Lesen von einem Socket unterscheidet sich von dem Lesen einer Datei, und es wird keine eindeutige EOF-Nachricht gesendet, und die Daten sind ein endloser Strom. Woher weißt du, wann du aufhören sollst? Mein TCPServer zum Beispiel in diesem Fall, wenn ich meinen Server durch Zugriff auf
http://localhost:9799
von einem Browser getroffen habe, hängt es, nachdem es keine Daten mehr zu lesen gibt und es den EOFError auch nicht werfen wird.
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
Ich würde gerne wissen, was ist die beste Praxis/Standard-Ansatz von Ruby-Servern. Ich sehe das Unicorn verwendet read_nonblock von kgio Bibliothek und Mongrel verwendet readpartial (Ich bin nicht sicher über diese, aber durch den Code geht das ist, was ich fühle, ist der Ansatz angenommen.) Auch mit Prüfungen für \ r \ n wie weiß der Server Die Eingabe ist abgeschlossen. Könnte erklären, wie dies getan werden sollte (und ich denke, gets
ist nicht der Ansatz - es mit read
, readpartial
, read_nonblock
).
2). Ich würde wirklich ein paar Zeilen darüber schätzen, wie dies in Servern wie Einhorn oder Beifahrer erreicht wird
Vielen Dank.
Vielen Dank für Ihre Antwort und Einführung in http_parser.rb. Kennen Sie irgendwelche Server, die die Parser-Bibliothek nicht verwenden und sich für einen anderen Ansatz entscheiden? – Sid
Ich kenne keine Server, die keine Parser verwenden, welche Art von einem anderen Ansatz? – Shtirlic
Es tut mir leid, was ich meinte, war Server, die die Bibliothek http_parser.rb nicht verwenden. – Sid