在Ruby http-2gem的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,但我不明白是怎么回事。服务器不会知道哪一个流是最后一个流。
假设没有错误,这个循环是如何结束的?
发布于 2016-12-03 03:08:38
这取决于它是否是安全连接。如果它是而不是安全连接,那么sock就是TCPSocket实例。
#eof?方法在IO类上定义。层次结构是:
TCPSocket < IPSocket < BasicSocket < IO
IO是一个类,它是套接字和File类的祖先。它具有通用的IO方法,我认为这些方法在具体实现中的工作方式有所不同。
如果套接字关闭或存在错误,则套接字可能处于类似eof的状态。也就是说,没有更多的数据可读。来自Ruby docs
如果ios位于文件末尾,则
#eof?返回true,这意味着没有更多数据可读。
我不知道在什么情况下套接字会关闭而不关闭,但这是一个更高层次的解释。您可以深入研究eof?实现以了解更多细节,以及一般的套接字。根据我的经验,像TCPSocket这样的类是系统实现的包装器。
https://stackoverflow.com/questions/40788646
复制相似问题