2010-03-03 68 views
5

我有一個ruby腳本,它同時並異步地接收和顯示來自服務器的消息,並允許用戶在控制檯上輸入。收到消息時,它正在寫入用戶正在輸入的內容。輸入本身不是亂碼,但看起來很可怕。理想情況下,它會保存用戶當前的輸入,輸出消息,然後在下一行恢復輸入。我已經通過攔截每一個關鍵事件來做到這一點,但我只記得這是一個重大麻煩。我對ruby相當陌生,所以我不確定是否有一種很好的方法來做到這一點,或者如何去做。輸出到控制檯,同時在ruby中保留用戶輸入

示例:用戶正在輸入>abcde,並且消息hello進來,並且用戶類型fgh之後。控制檯現在將顯示:

>abcdehellofgh 

並且用戶可以在最後繼續輸入。我想它顯示:

hello 
>abcdefgh 
+1

你能接受使用ncurses庫的解決方案嗎? – 2010-03-03 20:44:01

+0

當然。我對這個軟件包並不熟悉,但我很樂意看到一個例子。 – captncraig 2010-03-03 22:21:22

+0

更深入地觀察ncurses,它絕對看起來像我需要的,我只是不知道如何完成這一切。這個庫很複雜,ruby綁定沒有很好的文檔。 – captncraig 2010-03-05 02:54:57

回答

2

我的提案的兩個重要組成部分是:
1.系統(「stty的原料-echo」)#至立即得到任何類型的字符與
結合使用2.使用STDIN.getc和string-var作爲輸入緩衝區來重新打印用戶輸入。

按9(&布爾變量incoming_message)用於超簡單模擬您的服務器消息。
(因爲無論如何你都必須適應你的情況,所以更真實會使示例膨脹,因爲無論如何你必須適應你的想法。)

按x退出。

示例輸出:

$ ruby simultaneous_input_and_output.rb 
Hello World!9 
The incoming message is: true 
Hello World!9x 

You entered: 
Hello World!9x 
End! 



#!/usr/bin/ruby 

$input_buffer = ""; 
incoming_message = false 

begin 
    system("stty raw -echo") 

    begin 
    str = STDIN.getc 
    print str.chr 

    $input_buffer = $input_buffer + str.chr 
    if str.chr == '9' 
     incoming_message = true 
    end 
    if incoming_message 
     puts "\nThe incoming message is: " + incoming_message.to_s 
     print $input_buffer 
     incoming_message = false 
    end 
    end while (str.chr != 'x') 
ensure 
    system("stty -raw echo") 
end 

puts "\n\nYou entered:" 
puts $input_buffer 
puts "End!"  

PS: 爲系統( 「stty的原始-echo」)看到(用戶周杰倫) How to get a single character without pressing enter?

+0

我爲一個網絡課程編寫的聊天程序做了這個。它效果很好。 – Lolindrath 2010-03-12 17:49:40

1

我將面臨幾乎相同的問題。

我決定改變我的方法。我將編寫一個簡單的客戶端,其底部有一個文本輸入框,屏幕上還有一個消息窗口。

客戶端和服務器將使用某種消息格式(YAML)交換數據,因爲它可以很好地與Ruby一起使用,但它可能更簡單些。

(我不知道這恰恰是一個回答你的問題,但是。)

+0

它是一個很好的解決方法,我同意它可能是一個更好的設計,但我目前受限於這樣做。 – captncraig 2010-03-03 20:39:24