Ruby TCPSocket: Découvrez le volume de données est disponible
-
09-10-2019 - |
Question
Y at-il un moyen de savoir combien d'octets de données sont disponibles sur un TCPSocket en Ruby? C'est à dire. combien d'octets peut être prêt sans bloquer?
La solution
Le io/wait
de bibliothèque standard pourrait être utile ici. Requring donne des E / S de courant (prises et conduites) de nouvelles méthodes, parmi lesquelles ready?
. Selon la documentation , prêt? rendements non nulle s'il y a des octets disponibles sans bloquer. Il se trouve que la valeur non nulle, il retourne le nombre d'octets qui sont disponibles en IRM .
Voici un exemple qui crée un petit serveur socket muet, et se connecte alors avec un client. Le serveur envoie juste « foo » et ferme la connexion. Le client attend un peu pour donner le temps de serveur pour envoyer, puis imprime le nombre d'octets sont disponibles pour la lecture. Les choses intéressantes pour vous est dans le client:
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
Ne pas utiliser ce code serveur en temps réel de quoi que ce soit. Il est délibérément retardé afin de garder le simple exemple.
Note: Selon le livre Pioche, io / attente est disponible uniquement si "fonction FIONREAD dans ioctl (2)". Ce qui est sous Linux. Je ne sais pas à propos de Windows et d'autres.