Rubí TCPSocket: Descubre cómo está disponible la cantidad de datos
-
09-10-2019 - |
Pregunta
¿Hay una manera de saber cuántos bytes de datos están disponibles en una TCPSocket en Ruby? Es decir. cuántos bytes puede ser preparada sin el bloqueo?
Solución
El io/wait
biblioteca estándar podría ser útil aquí. Exigir a que da a base de corriente de I / O (enchufes y tuberías) algunos nuevos métodos, entre los que se ready?
. De acuerdo con la documentación , listo? retornos no nula si hay bytes disponibles sin bloquear. Lo que pasa es que el valor no nulo se devuelve el número de bytes que están disponibles en la RM .
Este es un ejemplo que crea un servidor de socket poco tonto, y luego se conecta a él con un cliente. El servidor simplemente envía "foo" y luego cierra la conexión. El cliente espera un poco para dar tiempo al servidor para enviar, y luego imprime cuántos bytes están disponibles para la lectura. El material interesante para usted está en el cliente:
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
No utilice ese código de servidor en algo real. Se retrasó deliberadamente con el fin de mantener el ejemplo sencillo.
Nota: Según el libro piqueta, io / espera sólo está disponible si "característica FIONREAD en ioctl (2)". Que está en Linux. No sé acerca de Windows y otros.