1

是否可以从缓冲区中删除 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()
    ...
4

2 回答 2

1

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

于 2012-01-10T12:11:34.417 回答
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 by char 模式并关闭本地回显。这样,当我收到一个字符时,我将其附加到 lineBuffer 并以“\r”前缀将其发送回,以覆盖最后一行。如果字符是返回字符,我会解析 lineBuffer。效果很好!

于 2012-01-11T15:16:37.063 回答