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

时间:2011-10-28 07:01:56

标签: python twisted telnet

我的目标是根据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.protocolTelnetProtocol联系起来
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

编辑2 已解决。最后一块是ClientFactory。

class TelnetClient( TelnetProtocol ):
    ...

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

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

  1. 由于我们需要一个telnet客户端,我们需要确保该协议是TelnetProtocol的实例。

  2. 工厂必须是ClientFactory。如果我们查看twisted.internet.endoints的来源,我们会看到我们传入端点的工厂包含在_WrappingFactory中,它来自ClientFactory。如果我们传入的这个工厂与ClientFactory没有相同的属性,那么当_wrappedFactory尝试调用ClientFactory的方法时会导致属性错误

1 个答案:

答案 0 :(得分:1)

你是正确的connectTCPendpoint.connect在功能上是相同的(大部分)。

假设TelnetProtocoltwisted.conch.telnet.TelnetProtocol,这里的问题是TelnetProtocol实际上不应该直接连接到TCP传输,它应该连接到twisted.conch.telnet.TelnetTransport 。您所看到的dataReceived中的“乱码”是实际的telnet协议字节,应该由twisted.conch.telnet.TelnetTransport(本身为IProtocol)进行解析以便调用enableLocal上的enableRemoteTelnetTransport等方法。{/ p>

我想在您基于connectTCP的示例中,您可能正在实例化TelnetTransport并将 .protocol属性设置为指向{{} 1}}。

基本上,请确保您传入的TelnetProtocol对象与您正在使用的Factory完全相同的protocol属性你的ClientFactory例子。

将来,还请包含完整的,可运行的代码示例,以便我们可以运行它们,看看会发生什么而不是猜测: - )。