Ruby http-2实现:eof如何工作?

时间:2016-11-24 14:15:30

标签: ruby sockets http2

在Ruby http-2 gem的example客户端实现中,底部有一段代码用于从套接字读取数据:

while !sock.closed? && !sock.eof?
  data = sock.read_nonblock(1024)
  # puts "Received bytes: #{data.unpack("H*").first}"

  begin
    conn << data
  rescue => e
    puts "#{e.class} exception: #{e.message} - closing socket."
    e.backtrace.each { |l| puts "\t" + l }
    sock.close
  end
end

我不明白这个循环是如何终止的。据推测,从插座中拾取了一个eof,但我不明白如何。它不像服务器会知道哪个流是最后一个。

假设没有错误,这个循环怎么结束?

1 个答案:

答案 0 :(得分:0)

取决于它是否是安全连接。如果 是安全连接,则sock是TCPSocket的实例。

在IO类上定义了#eof?方法。层次结构是:

TCPSocket&lt; IPSocket&lt; BasicSocket&lt; IO

IO是一个类,它是套接字和File类的祖先。它具有通用的IO方法,我认为在具体实现方面的工作方式不同。

如果套接字已关闭或出现错误,则套接字可能处于 eof-like 状态。也就是说,没有更多的数据可供阅读。来自Ruby docs

  

#eof?如果ios位于文件末尾,则返回true,表示没有更多数据可供读取。

我不知道套接字在什么条件下是eof而不是关闭,但这是一个更高级别的解释。您可以深入了解eof?实现以查看更多详细信息,以及一般的套接字。根据我的经验,像TCPSocket这样的类是系统实现的包装器。