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

Python 如何使用t.c.telnet构建端点,python,twisted,telnet,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.addCall

我的目标是根据
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客户端由
工厂
构建,然后由
反应器构建时,它将按预期运行。使用
工厂
调用connectTCP(…)

我在这里做错了什么

谢谢

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

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 )
解决这个问题有两个方面

  • 因为我们需要一个telnet客户端,所以我们需要确保该协议是
    TelnetProtocol
    的一个实例

  • 工厂必须是
    ClientFactory
    。如果我们查看
    twisted.internet.endoints
    的源代码,我们会看到传入端点的工厂被包装在
    \u WrappingFactory
    中,它是
    ClientFactory
    的后代。如果我们传入的工厂没有与
    ClientFactory
    相同的属性,那么
    \u wrappedFactory
    在尝试调用ClientFactory的方法时将导致AttributeErrors


  • 正确的说法是,
    connectTCP
    endpoint.connect
    在功能上是相同的(大多数情况下)

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

    我猜在基于
    connectTCP
    的示例中,您可能正在实例化
    TelnetTransport
    并将其
    .protocol
    属性设置为指向
    TelnetProtocol

    基本上,确保您传入的
    工厂
    对象具有与您在
    连接TCP
    示例中使用的
    客户端工厂
    完全相同的
    协议
    属性


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

    对,在使用TelnetTransport的connectTCP版本Im中。在我发布这个问题之前,我尝试在端点上实现同样的问题。查看我的编辑。存在的问题是,出现了一个AttributeError,表示Nonetype没有connectionLost。我还没有像你建议的那样比较属性。我的代码现在已经乱七八糟了,我将发布一个早上运行的示例(早上给我:))确保Factory对象具有与ClientFactory相同的属性的问题已经解决。查看编辑。