Tôi có một câu hỏi 2 phần vào đọc từ ổ cắm và làm thế nào là nó được quản lý trên máy chủ của Ruby như Unicorn hoặc mongrelLàm thế nào để đọc từ một ổ cắm TCPServer trong ruby bằng cách sử dụng đọc, readpartial và read_nonblock
- tôi đã học được mà để đọc từ một ổ cắm là khác nhau từ đọc một tập tin và rằng không có thông điệp EOF riêng biệt được gửi và dữ liệu là một dòng vô tận. Vậy làm thế nào để bạn biết khi nào nên ngừng đọc? TCPServer của tôi chẳng hạn trong trường hợp này khi tôi nhấn máy chủ của tôi bằng cách truy cập
http://localhost:9799
từ trình duyệt, nó bị treo sau khi không còn dữ liệu nào để đọc và nó cũng sẽ không ném 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
Tôi muốn biết whats thực hành/tiếp cận tiêu chuẩn tốt nhất được sử dụng bởi các máy chủ Ruby. Tôi thấy Unicorn sử dụng read_nonblock từ thư viện kgio và mongrel sử dụng readpartial (tôi không chắc chắn về điều này nhưng đi qua mã này là những gì tôi cảm thấy là cách tiếp cận được thông qua.) Ngay cả với kiểm tra cho \ r \ n làm thế nào để máy chủ biết đầu vào hoàn tất. Có thể giải thích cách thức này nên được thực hiện (và tôi nghĩ rằng gets
không phải là cách tiếp cận - với read
, readpartial
, read_nonblock
).
2). Tôi thực sự đánh giá cao một vài dòng về cách thức đạt được điều này trong các máy chủ như kỳ lân hoặc hành khách
Cảm ơn bạn.
Cảm ơn bạn đã phản hồi và giới thiệu tôi với http_parser.rb. Biết về bất kỳ máy chủ nào không sử dụng thư viện trình phân tích cú pháp và chọn không cho một số cách tiếp cận khác? – Sid
Tôi không biết các máy chủ không sử dụng các trình phân tích cú pháp, cách tiếp cận khác là gì? – Shtirlic
Xin lỗi ý tôi là các máy chủ không sử dụng thư viện http_parser.rb. – Sid