Tengo un código que estoy usando para obtener datos de un socket de red. Funciona bien, pero me abrí camino a través de ensayo y error. Humildemente confieso que no entiendo completamente cómo funciona, pero realmente me gustaría. (Esta era la carga de trabajo de código culted forma que encontré)Comprensión de IO.select when reading socket en Ruby
La parte que no entiendo comienza con "listo = IO.select ..." Estoy claro en:
- Lo IO.select anda (he intentado mirar hacia arriba, pero tengo aún más confusa con el núcleo y qué-no)
- lo que el argumento de matriz a IO.select es para
- lo dispuesto [0] está haciendo
- la idea general de leyendo 1024 bytes? a la vez
Aquí está el código:
@mysocket = TCPSocket.new('192.168.1.1', 9761)
th = Thread.new do
while true
ready = IO.select([@mysocket])
readable = ready[0]
readable.each do |socket|
if socket == @mysocket
buf = @mysocket.recv_nonblock(1024)
if buf.length == 0
puts "The server connection is dead. Exiting."
exit
else
puts "Received a message"
end
end
end
end
end
Gracias de antemano por ayudarme "aprender a pescar". Odio tener partes de mi código que no entiendo completamente, solo funciona por coincidencia.
Pero, ¿por qué usas un hilo nuevo? ¿Cuáles son los pros y los contras de eso? – DiegoSalazar
Corrí el ejemplo poniendo un montón de 'puts' dentro y no puedo entender por qué el programa nunca entra en el bucle' while true' (o puede ser 'puts' salida dentro del bucle nunca llega a la consola?) – Paul