小能豆

使用 Twisted 来实现某种服务器

py

我正在使用 Twisted 来实现某种服务器。当我测试它时,它收到的第一行总是很奇怪:

Starting Server...
New connection from  192.168.1.140
192.168.1.140: ÿûÿû ÿûÿû'ÿýÿûÿý\NAME Blurr
192.168.1.140: \NAME Blurr

(对于我发送的两个输入\NAME Blurr。)

这是打印输入的代码:

def lineReceived(self, line):
    print "{0}: {1}".format(self.name, line)

我通过 Putty 通过 Telnet 连接到远程主机。这是我缺少的 telnet 协议吗?还是什么?当我使用 Unix 的 telnet 程序并在本地连接时,第一行没有问题。


阅读 5

收藏
2024-11-20

共1个答案

小能豆

从您提供的情况来看,您遇到的奇怪字符可能与 Telnet 协议的处理有关,尤其是字符编码和数据缓冲的处理。可能的问题有以下几种:

1. Telnet 协议的控制字符

Telnet 协议使用控制字符来进行通信,例如终止符、命令和选项协商等。某些 Telnet 客户端(比如 PuTTY)在连接时可能会发送这些控制字符,导致您看到的乱码。尤其是 ÿûÿû ÿûÿû'ÿýÿûÿý 这样的字符很可能是 Telnet 协议中的控制字符或者编码问题的表现。

2. 字符编码问题

Telnet 客户端和服务器之间可能存在字符编码的不匹配问题,尤其是如果输入包含特殊字符(比如非 ASCII 字符)。当您使用 Unix telnet 时,它可能默认使用更符合您系统的字符编码,而 PuTTY 可能使用不同的编码。

3. Twisted 和 Telnet 协议

Twisted 使用 telnet 协议时,可能没有正确处理 Telnet 特有的协议命令,导致某些控制字符没有被解析并正常显示。为了正确处理这些情况,您可以使用 TelnetProtocol 来处理 Telnet 特定的协议行为。

解决方法

1. 禁用 Telnet 选项处理

如果您确定需要在 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 协议中的一些控制字符和选项。

2. 确认编码设置

在 PuTTY 中,您可以设置字符编码。检查 PuTTY 的字符集设置,确保它与您的 Twisted 服务器一致(例如,您可以设置为 UTF-8 编码)。在 PuTTY 中,导航到 Window -> Translation,然后选择 UTF-8 编码,看看是否能解决乱码问题。

3. 手动去除控制字符

如果您不想使用 TelnetProtocol,也可以手动清除输入中的控制字符。您可以在 lineReceived 方法中添加额外的代码来过滤掉非可打印字符,或者将其转换为适当的字符编码:

python def lineReceived(self, line): # 过滤掉非打印字符 line = ''.join(c for c in line if c.isprintable()) print(f"{self.name}: {line}")

总结

  • 如果您使用的是 Telnet,建议使用 Twisted 的 TelnetProtocol 类来处理 Telnet 特有的协议行为。
  • 确认您的客户端(如 PuTTY)和服务器之间使用一致的字符编码(通常使用 UTF-8)。
  • 如果问题仍然存在,可以尝试手动清理输入数据中的控制字符。

希望这些建议能够帮助您解决问题!

2024-11-20