Skip to main content
 首页 » 编程设计

python之如何使用 t.c.telnet 构建端点

2025年05月04日9EasonJim

我的目标是根据 TCP4ClientEndpoint 创建 telnet 客户端作为端点实现。

这是我正在做的:

class TelnetClient( TelnetProtocol ): 
    ... 
 
factory = Factory() 
factory.protocol = TelnetClient 
point = TCP4ClientEndpoint( reactor, x.x.x.x, 23 ) 
defer = point.connect( factory ) 
 
defer.addCallback( todo ) 
reactor.run 

TelnetClient类处理身份验证、登录、触发命令等。

当我使用这种方法时,我可以读取 dataReceived 的一些输出, 但这是胡言乱语。

telnet 客户端在由 Factory 构造时按预期运行然后 reactor.connectTCP(...)用 Factory 调用.

我这里做错了什么?

谢谢!

编辑 1 连接 TelnetClient至 factory.protocol通过TelnetProtocol

class TelnetClient( TelnetProtocol ): 
    ... 
 
factory = Factory() 
factory.protocol = TelnetTransport( TelnetClient ) 
point = TCP4ClientEndpoint( reactor, x.x.x.x, 23 ) 
defer = point.connect( factory ) 
 
defer.addCallback( todo ) 
reactor.run 

EDIT 2 已解决。最后一 block 是 ClientFactory。

class TelnetClient( TelnetProtocol ): 
    ... 
 
factory = ClientFactory() 
factory.protocol = TelnetTransport( TelnetClient ) 
point = TCP4ClientEndpoint( reactor, x.x.x.x, 23 ) 
defer = point.connect( factory ) 

解决这个问题有两个方面。

  1. 因为我们想要一个 telnet 客户端,我们需要确保该协议(protocol)是 TelnetProtocol 的一个实例。 .

  2. 工厂必须是ClientFactory .如果我们查看 twisted.internet.endoints 的来源,我们看到我们传递给端点的工厂包装在 _WrappingFactory 中,它来自 ClientFactory .如果我们传入的这个工厂没有与ClientFactory相同的属性, 然后是 _wrappedFactory当它尝试调用 ClientFactory 的方法时将导致 AttributeErrors

请您参考如下方法:

你是对的,connectTCP 和 endpoint.connect 在功能上是相同的(大部分)。

假设 TelnetProtocol 是 twisted.conch.telnet.TelnetProtocol,这里的问题是 TelnetProtocol 不应该直接连接到TCP 传输,它应该连接到 twisted.conch.telnet.TelnetTransport。您看到的 dataReceived 中的“乱码”是实际的 telnet 协议(protocol)字节,应该由 twisted.conch.telnet.TelnetTransport(这是本身是一个 IProtocol),以便在 TelnetTransport 上调用 enableLocal 和 enableRemote 等方法。

我猜想在您基于connectTCP 的示例中,您可能正在实例化一个TelnetTransport 并设置它的 .protocol 属性指向 TelnetProtocol。

基本上,确保您传入的Factory 对象具有完全与ClientFactory 相同的protocol 属性 您在 connectTCP 示例中使用。

在未来,也请包括完整的、可运行的代码示例,以便我们可以运行它们并查看会发生什么,而不是猜测 :-)。