Ruby TCPSocket: узнайте, сколько данных доступно
-
09-10-2019 - |
Вопрос
Есть ли способ узнать, сколько байтов данных доступно на TCPSocket в Ruby? Т.е. Сколько байтов может быть готово без блокировки?
Решение
Стандартная библиотека io/wait
может быть полезен здесь. Защита от него дает вводе/вывода на основе потока некоторые новые методы, среди которых есть ready?
. Анкет Согласно документация, готов? Возвращает не-ноль, если есть байты, доступные без блокировки. Так получилось, что не-ноль значение возвращает ему количество байтов, которые доступны в МРТ.
Вот пример, который создает тупой маленький сервер сокетов, а затем подключается к нему с клиентом. Сервер просто отправляет «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 доступен только в том случае, если «Fionread Feature в ioctl (2)». Который это в Linux. Я не знаю о Windows и других.