Удалить строку ввода в сеансе telnet - PullRequest
1 голос
/ 08 января 2012

Можно ли удалить строку ввода в сеансе telnet из буфера, поэтому при нажатии клавиши ввода введенный текст удаляется, но все же отправляется на сервер telnet?

Я знаю, что есть способ отправить определенный символ, который перемещает курсор в начало строки, а затем перезаписывает строку новым, но поскольку новая строка chatacter помещается в буфер, яне могу пройти мимо этого.Есть ли способ обойти это?

Пример: (Вторая строка - ввод пользователя)

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 ]

1 голос
/ 10 января 2012

Я думаю, что эта проблема не имеет особой связи с gevent, так как ее API сокетов похож на оригинальный модуль сокетов. И на вопрос не влияет выполнение квазипараллельных гринлетов gevent. Попробуйте использовать socket.recv () вместо fileobj.readline ().

0 голосов
/ 11 января 2012

В итоге я использовал 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 и отключать локальное отображение.Таким образом, когда я получаю символ, я добавляю его в lineBuffer и отправляю обратно с префиксом "\ r", чтобы перезаписать последнюю строку.Если char является возвращаемым char, я анализирую lineBuffer.Прекрасно работает!

...