在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,但我不明白如何。它不像服务器会知道哪个流是最后一个。
假设没有错误,这个循环怎么结束?
答案 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这样的类是系统实现的包装器。