Skip to main content
 首页 » 编程设计

python之为什么来自套接字服务器的文本会删除以前写入的文本

2025年05月04日16oomusou

这太奇怪了,我不确定如何寻找答案。我有一个 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 向我显示字符串中的任何隐藏字符?

谢谢!

请您参考如下方法:

如果你打印 repr(send) 和 repr(received) 而不是仅仅打印 sent 和 received ,您将更清楚地了解您发送的内容和返回的内容(因此您可以检查@theatrus 的建议是否正确,等等,并且始终清楚地看到您的内容正在做)。

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

一遍又一遍,如果您不使用 repr,您将浪费大量时间调试您无法真正看到的问题,因为通过错误,因此导致上述问题未在日志中清楚显示(非打印字符、控制字符等)。

因此,请始终使用 repr 来显示或记录字符串,除非您 100% 确定它们完全正确且可预测 - 养成习惯,这并不比 一旦您养成习惯,就不要这样做,多年来,您将有很多机会感谢这个简单的小原则。