2010-10-21 20 views

回答

5

標準庫io/wait在此處可能會有用。要求它爲基於流的I/O(套接字和管道)提供了一些新的方法,其中包括ready?。根據documentation,準備好了嗎?如果有可用字節沒有阻塞,則返回非零。恰好碰巧非零值返回它在MRI中可用的字節數

下面是一個創建一個愚蠢的小型套接字服務器,然後用它連接到客戶端的例子。服務器只發送「foo」,然後關閉連接。客戶端稍等一會以便服務器發送時間,然後打印出可供讀取的字節數。有趣的東西是在客戶端:

require 'socket' 
require 'io/wait' 

# Server 

server_socket = TCPServer.new('localhost', 0) 
port = server_socket.addr[1] 
Thread.new do 
    session = server_socket.accept 
    sleep 0.5 
    session.puts "foo" 
    session.close 
end 

# Client 

client_socket = TCPSocket.new('localhost', port) 
puts client_socket.ready? # => nil 
sleep 1 
puts client_socket.ready? # => 4 

不要使用任何真實的服務器代碼。爲了保持這個例子簡單,它被故意推遲。

注意:根據Pickaxe書籍,io/wait只有在「ioctl(2)中的FIONREAD功能」時纔可用。它在Linux中。我不知道Windows &其他人。

+0

你知道JRuby可用嗎? – panzi 2010-10-22 00:13:04

+0

@panzi,我不知道JRuby,所以我不知道。本頁建議該功能可能可用,但使用與MRI不同的類:http://jruby.org/apidocs/org/jruby/util/io/CRLFStreamWrapper.html(向下滾動到「ready?」)。 – 2010-10-22 01:08:15

+0

我在JRuby下試過了。該方法在那裏,但它只會返回'1',而不是真正的金額,如果可以讀取。那麼,我可以在沒有這個的情況下實現它,但它會更有效率。 – panzi 2010-10-22 13:51:00

相關問題