我有一个关于从套接字读取以及如何在 Unicorn 或 Mongrel 等 Ruby 服务器上进行管理的两部分问题
- 我了解到,从套接字读取与读取文件不同,并且没有发送明显的 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 (我不确定这些,但通过代码,我觉得这是采用的方法。)即使检查 \r\n 服务器如何知道输入完成。可以解释应该如何做到这一点(我认为gets
这不是方法 - 它带有read
, readpartial
, read_nonblock
)。
2)。我真的很感激关于如何在独角兽或乘客等服务器中实现这一点的几行
谢谢你。