在Ruby中接收来自STDIN的输入

时间:2017-01-06 12:38:42

标签: ruby unix io stdin netcat

我正在尝试使用GNU netcat的-e标志,它允许您将程序附加到TCP套接字,以便它可以使用STDIN / STDOUT发送和接收消息。我在编写一个简单的Ruby程序时遇到了一些麻烦,该程序将其输入回送给客户端。这就是我现在所拥有的:

#!/usr/bin/env ruby

while line = gets.chomp do
    puts line
end

我可以使用此命令将此程序作为服务器运行:nc -l -p 1299 -e ./chat-client.rb。但是如果我使用nc localhost 1299连接到我的服务器,我的通信就像这样:

输入:

I just don't know.
What is going wrong here?

服务器^ C后的输出:

/chat-client.rb:3:in `gets': Interrupt
    from ./chat-client.rb:3:in `gets'
    from ./chat-client.rb:3:in `<main>'
I just don't know.
What is going wrong here?

如果我在服务器之前使用客户端,则根本不会给出任何输出。我做错了什么?

1 个答案:

答案 0 :(得分:3)

Ruby可以在写入STDOUT之前将输出保存在缓冲区中,并且一旦打印出不确定数量的数据就写入。如果您将代码更改为:

#!/usr/bin/env ruby

while line = gets.chomp do
  puts line
  STDOUT.flush
  # $stdout.flush works too, though the difference
  # is outside the scope of this question
end

您可以在关闭输入流之前看到输出。

至于&#34; ^ C服务器之前的客户端&#34;,立即关闭进程将忽略所有尚未刷新的数据。