有没有办法在 Ruby 中找出 TCPSocket 上可用的数据字节数?即在不阻塞的情况下可以准备多少字节?
问问题
2453 次
1 回答
7
标准库io/wait
在这里可能有用。要求它为基于流的 I/O(套接字和管道)提供了一些新方法,其中包括ready?
. 根据文档,准备好了吗?如果有可用的字节而不阻塞,则返回非零。碰巧它返回的非零值是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 和其他人。
于 2010-10-21T02:23:45.303 回答