我正在尝试使用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?
如果我在服务器之前使用客户端,则根本不会给出任何输出。我做错了什么?
答案 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;,立即关闭进程将忽略所有尚未刷新的数据。