为什么套接字服务器的文本擦除以前写的文本?

时间:2010-06-13 00:40:07

标签: python sockets

这很奇怪,我不知道如何寻找答案。我有一个Python程序,通过TCP / IP套接字与基于telnet的服务器通信。如果我手动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:”文本更长一些,我可以更好地了解正在发生的事情。假设我将READ更改为12345678901234567890,因此读取为:

12345678901234567890: SET MDI ACK

我得到的是:

SET MDI ACK234567890:

因此,似乎我从服务器返回的任何文本都以某种方式删除了我之前想要的内容。我尝试将所有保存的行保存在列表中,然后在最后将它们打印出来,但它完全相同。

有关正在发生的事情,甚至是如何调试此事的任何想法?有没有办法让Python向我显示字符串中隐藏的字符,例如?

THX!

3 个答案:

答案 0 :(得分:3)

如果您打印repr(send)repr(received)而不是仅打印sentreceived,您就可以更准确地了解您要发送的内容和内容你回来了(所以你可以检查@theatrus的建议是否正确,等等,并且在任何时候都能清楚地看到你在做什么)。

这接近我最喜欢的实用原则之一:每当打印或记录可能出错的字符串时,总是打印其repr(或%r而不是%s,如果你正在进行格式化,从不只是普通字符串本身(或它的%s,它对它没有任何作用)。

一遍又一遍,如果你不使用repr,你将浪费大量时间来调试你无法真正看到的问题,因为那些错误地隐藏在字符串中的字符是因此导致所述问题在日志中没有清楚地显示(非打印字符,控制字符等)。

所以,总是使用repr来显示或记录字符串,除非你100%确定它们是完全正确和可预测的 - 养成习惯,并不比更难< / em>一旦你 习惯这样做,多年来你会有很多时候感谢这个简单的原则。

答案 1 :(得分:2)

你可能有一个没有换行符的迷路回车。尝试在Python中使用原始字符串,看看是什么。

答案 2 :(得分:1)

很可能你的telnet程序期待CR-LF描述的新行,而Python正在使用LF或CR feed。