4
有沒有辦法找出在Ruby的TCPSocket上有多少字節的數據可用?即多少個字節可以不阻塞地準備好?Ruby TCPSocket:找出有多少數據可用
有沒有辦法找出在Ruby的TCPSocket上有多少字節的數據可用?即多少個字節可以不阻塞地準備好?Ruby TCPSocket:找出有多少數據可用
標準庫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 &其他人。
你知道JRuby可用嗎? – panzi 2010-10-22 00:13:04
@panzi,我不知道JRuby,所以我不知道。本頁建議該功能可能可用,但使用與MRI不同的類:http://jruby.org/apidocs/org/jruby/util/io/CRLFStreamWrapper.html(向下滾動到「ready?」)。 – 2010-10-22 01:08:15
我在JRuby下試過了。該方法在那裏,但它只會返回'1',而不是真正的金額,如果可以讀取。那麼,我可以在沒有這個的情況下實現它,但它會更有效率。 – panzi 2010-10-22 13:51:00