我有一台Linux计算机(IP:10.0.0.33),在其中运行netcat作为4444端口的侦听器。我还有一台Windows 10计算机,该计算机使用TCPSocket类连接到Linux计算机。
我写了一段代码,以帮助我理解IO.select如何与套接字对象以及IO对象STDIN和STDOUT一起工作,但我只是想不通。
这是我的代码:
require 'socket'
socket = TCPSocket.open("10.0.0.33", 4444)
while true
IO.select([socket], nil, nil) #I'm changing the arguments in this line
puts(1)
socket.gets.chomp
puts(2)
sleep(1)
end
如我所料,如果我运行上述代码,直到从Linux机器发送消息之前,什么都不会发生。当我这样做时,将打印出1和2,然后再没有任何反应,直到我从Linux发送另一条消息为止(如我所料)。
但是,如果我仅将IO.select行更改为
IO.select(nil, [socket], nil)
立即打印出1,我不明白为什么。
如果我向以下任何人发出此行:
IO.select(nil, [STDIN], nil)
IO.select(nil, [STDOUT], nil)
IO.select([STDOUT], nil, nil)
立即打印1。
为什么每次我在IO.select函数的输出数组参数中放入内容时,IO.select都不会等待? 我以为它应该找到一个准备好通过发送一些数据的IO流,但是我在此程序中什么也不发送。
为什么还要将STDOUT放在IO.select函数的输入数组参数中呢?