我正在使用 Twisted 来实现某种服务器。当我测试它时,它收到的第一行总是很奇怪:
Starting Server... New connection from 192.168.1.140 192.168.1.140: ÿûÿû ÿûÿû'ÿýÿûÿý\NAME Blurr 192.168.1.140: \NAME Blurr
(对于我发送的两个输入\NAME Blurr。)
\NAME Blurr
这是打印输入的代码:
def lineReceived(self, line): print "{0}: {1}".format(self.name, line)
我通过 Putty 通过 Telnet 连接到远程主机。这是我缺少的 telnet 协议吗?还是什么?当我使用 Unix 的 telnet 程序并在本地连接时,第一行没有问题。
从您提供的情况来看,您遇到的奇怪字符可能与 Telnet 协议的处理有关,尤其是字符编码和数据缓冲的处理。可能的问题有以下几种:
Telnet 协议使用控制字符来进行通信,例如终止符、命令和选项协商等。某些 Telnet 客户端(比如 PuTTY)在连接时可能会发送这些控制字符,导致您看到的乱码。尤其是 ÿûÿû ÿûÿû'ÿýÿûÿý 这样的字符很可能是 Telnet 协议中的控制字符或者编码问题的表现。
ÿûÿû ÿûÿû'ÿýÿûÿý
Telnet 客户端和服务器之间可能存在字符编码的不匹配问题,尤其是如果输入包含特殊字符(比如非 ASCII 字符)。当您使用 Unix telnet 时,它可能默认使用更符合您系统的字符编码,而 PuTTY 可能使用不同的编码。
telnet
Twisted 使用 telnet 协议时,可能没有正确处理 Telnet 特有的协议命令,导致某些控制字符没有被解析并正常显示。为了正确处理这些情况,您可以使用 TelnetProtocol 来处理 Telnet 特定的协议行为。
TelnetProtocol
如果您确定需要在 Twisted 服务器上使用 Telnet,可以使用 TelnetProtocol 来确保服务器正确处理协议选项。这样可以避免乱码问题。下面是一个简单的示例,展示了如何使用 TelnetProtocol:
```python from twisted.protocols import telnet from twisted.internet import protocol from twisted.internet import reactor
class TelnetServerProtocol(telnet.TelnetProtocol): def lineReceived(self, line): print(f”{self.name}: {line}”)
class TelnetServerFactory(protocol.ServerFactory): protocol = TelnetServerProtocol
reactor.listenTCP(23, TelnetServerFactory()) reactor.run() ```
TelnetProtocol 会自动处理 Telnet 协议中的一些控制字符和选项。
在 PuTTY 中,您可以设置字符编码。检查 PuTTY 的字符集设置,确保它与您的 Twisted 服务器一致(例如,您可以设置为 UTF-8 编码)。在 PuTTY 中,导航到 Window -> Translation,然后选择 UTF-8 编码,看看是否能解决乱码问题。
UTF-8
Window
Translation
如果您不想使用 TelnetProtocol,也可以手动清除输入中的控制字符。您可以在 lineReceived 方法中添加额外的代码来过滤掉非可打印字符,或者将其转换为适当的字符编码:
lineReceived
python def lineReceived(self, line): # 过滤掉非打印字符 line = ''.join(c for c in line if c.isprintable()) print(f"{self.name}: {line}")
希望这些建议能够帮助您解决问题!