2016-11-24 46 views
2

在Ruby HTTP-2的宝石有在底部从套接字读取数据的代码段的example客户端实现:Ruby http-2实现:eof如何工作?

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

这取决于它是否是安全连接。如果它是而不是一个安全连接,那么袜子是TCPSocket的一个实例。

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

的TCPSocket < IPSocket < BasicSocket < IO

IO是一类既插座和File类的祖先。它已经推广了IO方法,我认为在具体实现上工作方式不同。

如果套接字是封闭的或有错误,则该插座可以为EOF状状态。也就是说,没有更多的数据要读取。从Ruby docs

#eof?返回true如果IOS是在文件末尾,这意味着没有更多的数据读取。

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

+0

你知道循环通常如何结束吗? –