2012-01-08 46 views
1

是否可以從緩衝區中刪除telnet會話中的輸入行,因此當您按Enter時,您鍵入的文本被刪除,但仍發送到telnet服務器?刪除Telnet會話中的輸入行

我知道有一種方法可以發送一個字符,將光標移動到行的開頭,然後用新的字符覆蓋行,但是由於新的行字符被放入緩衝區,不要過去。有沒有辦法解決這個問題?

實施例:(第二行是用戶輸入)

Welcome to my imba text game! 
pick up axe 

然後按下輸入和屏幕緩衝器讀取:

Welcome to my imba mud game! 
[You picked up the axe] 

更新:

我認爲關鍵是將Telnet客戶端設置爲某些不會回顯本地輸入的模式。 我發現發送一些魔術字符到客戶端可以改變模式。我發現這個例子,我不知道它是什麼意思,但它防止輸入顯示在telnet客戶端。然而,輸入永遠不會發送到服務器,所以它只是答案的一半。

socket.send("\377\375\042\377\373\001") 

也許是因爲我在逐行讀取輸入。我希望它被char讀爲char。不知道如何修改這個,雖然這樣做:

fileobj = socket.makefile() 
while True: 
    line = fileobj.readline() 
    ... 
+0

這不可能,或者是我的問題含糊不清? – oskob 2012-01-08 16:16:43

回答

1

我認爲,這個問題與GEVENT沒有特殊的關係,因爲它是套接字API是類似原來的插座模塊。問題不受gevent的quazi-parallel greenletes執行的影響。 嘗試使用socket.recv()而不是fileobj.readline()。

0

我確實最終使用socket.rscv(),但我不知道這是否重要。解決的辦法是談判字符的這個魔術sequens,我只是在連接發送到Telnet客戶端:

socket.send(chr(0xff) + chr(0xfb) + chr(0x01) + chr(0xff) + chr(0xfb) + chr(0x03) + chr(0xff) + chr(0xfd) + chr(0x0f3)) 

它基本上是告訴客戶端通過一個字符模式和草坪關閉本地回顯使用字符。這樣,當我收到一個字符時,我將它追加到一個lineBuffer中,並用「\ r」前綴將它返回,以覆蓋最後一行。如果char是一個返回字符,我解析lineBuffer。很棒!