【问题标题】:How to construct endpoints with t.c.telnet如何使用 t.c.telnet 构建端点
【发布时间】:2011-12-17 02:06:09
【问题描述】:

我的目标是根据 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 构造,然后使用 Factory 调用 reactor.connectTCP(...) 时,它会按预期运行。

我在这里做错了什么?

谢谢!

EDIT 1 通过TelnetProtocolTelnetClient 连接到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

EDIT 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的方法时会导致AttributeErrors

【问题讨论】:

    标签: python twisted telnet


    【解决方案1】:

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

    假设TelnetProtocoltwisted.conch.telnet.TelnetProtocol,这里的问题是TelnetProtocol 不应该直接连接到TCP 传输,它应该连接到twisted.conch.telnet.TelnetTransport。您看到的dataReceived 中的“胡言乱语”是实际的 telnet 协议字节,它们应该由 twisted.conch.telnet.TelnetTransport(它本身就是 IProtocol)解析,以便调用像 enableLocalenableRemoteTelnetTransport

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

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

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

    【讨论】:

    • 对,在connectTCP版本中我使用TelnetTransport。在发布此问题之前,我尝试使用端点实现相同的功能。看看我的编辑。那里的问题是出现了一个 AttributeError 说 Nonetype 没有 connectionLost。我还没有按照您的建议比较属性。我的代码现在被黑了,我会发布一个早上运行的示例(早上对我来说:))
    • 解决了确保工厂对象与 ClientFactory 具有相同属性的问题。查看编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多