我从插座读取2部分的问题以及它是如何在Ruby的服务器,比如麒麟或杂种管理如何从一个红宝石TCPSERVER插槽读取使用读,readpartial和read_nonblock
- 我学到从套接字中读取与读取文件不同,并且没有发送明确的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
我想知道什么是最好的做法/标准方法由红宝石服务器使用。我看到Unicorn使用kgio库中的read_nonblock库和mongrel使用readpartial(我不确定这些但通过代码,这是我认为是采用的方法。)即使检查\ r \ n服务器如何知道输入完成。 可以解释这应该怎么做(我认为gets
不是这种方法 - 它与read
,readpartial
,)。 2)。我真的很感激有几行关于如何在独角兽或乘客这样的服务器上实现这一点
谢谢。
感谢您的回复并向我介绍http_parser.rb。了解任何不使用解析器库并选择其他方法的服务器? – Sid
我不知道不使用解析器的服务器,还有什么样的另一种方法? – Shtirlic
我很抱歉,我的意思是不使用http_parser.rb库的服务器。 – Sid