2016-11-24 76 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

你知道循環通常如何結束嗎? –