Стандартная библиотека io/wait
может быть полезна здесь.Требование к нему дает потоковому вводу / выводу (сокеты и каналы) некоторые новые методы, среди которых 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 доступна только в том случае, если в FIXREAD имеется функция ioctl (2).Который есть в Linux.Я не знаю о Windows и других.