我的目标是根据 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 )
解决这个问题有两个方面。
因为我们想要一个 telnet 客户端,我们需要确保该协议(protocol)是
TelnetProtocol的一个实例。 .工厂必须是
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 示例中使用。
在未来,也请包括完整的、可运行的代码示例,以便我们可以运行它们并查看会发生什么,而不是猜测 :-)。
