在telnet会话中移除输入行
在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")
也许是因为我按行读取输入。我希望它能按字符读取。不过我不知道该怎么修改才能做到这一点:
fileobj = socket.makefile()
while True:
line = fileobj.readline()
...
2 个回答
0
最后我用了socket.rscv()这个方法,但我不太确定这是否重要。解决方案是我在连接时发送给telnet客户端的一串神奇的协商字符:
socket.send(chr(0xff) + chr(0xfb) + chr(0x01) + chr(0xff) + chr(0xfb) + chr(0x03) + chr(0xff) + chr(0xfd) + chr(0x0f3))
这基本上是告诉客户端使用逐字符模式,并关闭本地回显。这样,当我接收到一个字符时,我会把它加到一个叫lineBuffer的地方,然后在前面加上"\r"再发送回去,这样就可以覆盖掉最后一行。如果接收到的是回车字符,我就会处理lineBuffer里的内容。效果很好!
1
我觉得这个问题和gevent没有什么特别的关系,因为它的socket接口和原来的socket模块很相似。而且这个问题也不受gevent的伪并行绿色线程执行的影响。你可以试着用socket.recv()来代替fileobj.readline()。