删除telnet会话中的输入行

时间:2012-01-08 11:44:22

标签: python telnet gevent

是否可以从缓冲区中删除telnet会话中的输入行,因此当您按Enter键时,您键入的文本将被删除,但仍会发送到telnet服务器?

我知道有一种方法可以发送某个字符,将光标移动到行的开头,然后用新的行覆盖该行,但由于新行的chatacter被放入缓冲区,我不能过去那个。有办法解决这个问题吗?

示例:(第二行是用户输入)

Welcome to my imba text game!
pick up axe

然后按Enter键,屏幕缓冲区显示:

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()
    ...

2 个答案:

答案 0 :(得分:1)

我认为,这个问题与gevent没有特殊的联系,因为它的套接字API类似于原始套接字模块。而这个问题并没有受到gevent的quazi-parallel greenletes执行的影响。 尝试使用socket.recv()而不是fileobj.readline()。

答案 1 :(得分:0)

我最终使用的是socket.rscv(),但我不知道这是否重要。解决方案是协商字符的神奇序列,我只是在连接时发送到telnet客户端:

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

它基本上告诉客户端通过char模式使用char并关闭本地回显。这样,当我收到一个char时,我将它附加到lineBuffer并用“\ r”前缀发回它,以覆盖最后一行。如果char是返回char,我解析lineBuffer。效果很棒!