2012-01-08 70 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。很棒!