почему текст с сервера сокетов стирает ранее написанный текст? - PullRequest
1 голос
/ 13 июня 2010

Это достаточно странно, я не уверен, как искать ответ. У меня есть программа на Python, которая общается через сокеты TCP / IP с сервером на основе telnet. Если я войду в систему вручную и наберу такие команды:

SET MDI G0 X0 Y0

сервер выложит строку наподобие этой:

SET MDI ACK

Довольно стандартные вещи. Вот странная часть. Если в моем коде я предшествую печати каждой из этих строк каким-то текстом, возвращаемая строка стирает то, что я пытаюсь напечатать перед этим. Например, если я напишу код, он должен выглядеть следующим образом:

SENT: SET MDI G0 X0 Y0
READ: SET MDI ACK

Вместо этого я получаю:

SENT: SET MDI G0 X0 Y0
SET MDI ACK

Теперь, если я сделаю текст "ЧИТАТЬ:" немного длиннее, я смогу лучше понять, что происходит. Допустим, я изменил READ: на 12345678901234567890, так что должно читать как:

12345678901234567890: SET MDI ACK

Вместо этого я получаю:

SET MDI ACK234567890:

Похоже, что любой текст, который я получаю с сервера, каким-то образом удаляет то, чем я пытаюсь предшествовать. Я попытался сохранить все свои сохраненные строки в списке, а затем распечатать их в конце, но это точно так же.

Есть идеи о том, что происходит, или даже о том, как это отладить? Есть ли способ заставить Python показывать мне скрытые символы в строке, например?

ТНХ!

Ответы [ 3 ]

3 голосов
/ 13 июня 2010

Если вы напечатаете repr(send) и repr(received) вместо простой печати sent и received, у вас будет гораздо более четкое представление о том, что именно вы отправляете и что вы получаете взамен ( так что вы можете проверить правильность предложения @theatrus и т. д., и т. д., и всегда четко видеть, что вы делаете).

Это близко к одному из моих любимых прагматических принципов: всякий раз, когда вы печатаете или записываете строку, которая может быть ошибочной, всегда печатает repr (или %r вместо %s, если вы выполняете форматирование), никогда , а не просто обычная строка (или ее %s, которая ничего не делает с ней).

Снова и снова, если вы не используете repr, вы потратите значительное количество времени на отладку проблем, которые вы не можете увидеть, потому что символы, которые пробираются в строку по ошибке и поэтому вызывают указанные проблемы не отображаются четко в журналах (непечатные символы, управляющие символы и т. д.).

Таким образом, всегда используйте repr для отображения или записи строк, если вы не уверены на 100%, что они совершенно правильные и предсказуемые - войдите в привычку, это не сложнее, чем не делая это, как только вы приобретаете привычку , и на протяжении многих лет у вас будет много поводов поблагодарить этот маленький простой принцип.

2 голосов
/ 13 июня 2010

Вероятно, у вас возвращение случайной каретки без перевода строки.Попробуйте вместо этого использовать необработанные строки в Python.

1 голос
/ 13 июня 2010

Скорее всего, ваша программа telnet ожидает, что CR-LF определит новые строки, а Python работает с каналами LF или CR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...