2017-01-06 35 views
0

我正在試驗GNU netcat的-e標誌,它允許您將程序附加到TCP套接字,以便它可以使用STDIN/STDOUT發送和接收消息。我在編寫一個簡單的Ruby程序時遇到了一些麻煩,它會將其輸入回送給客戶端。以下是我現在有:在Ruby中接收來自STDIN的輸入

#!/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-ING服務器:

/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? 

如果我^ C的客戶端在服務器之前,根本沒有輸出。我究竟做錯了什麼?

回答

2

在寫入STDOUT之前,Ruby可能會將輸出保存在緩衝區中,並且會在打印不確定數量的數據時寫入一次。如果你改變你的代碼如下:

#!/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 

你可以期望看到輸出關閉輸入流之前。

至於「^ C服務器之前的客戶端」,立即關閉進程將忽略所有尚未刷新的數據。

+0

_「一旦打印了不確定數量的數據,Ruby就只輸出到標準輸出。」 - 嚴格地說,這是不正確的。 – mudasobwa

+0

改編爲精度/挑剔;) – cobaltsoda

+1

我刪除了我的答案,因爲你的包含更好的解釋。儘管考慮在'STDOUT'上使用'$ stdout',因爲前者可能會輕鬆更改。 – mudasobwa

相關問題