我的目标是根据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
编辑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
的来源,我们会看到我们传入端点的工厂包含在_WrappingFactory
中,它来自ClientFactory
。如果我们传入的这个工厂与ClientFactory
没有相同的属性,那么当_wrappedFactory
尝试调用ClientFactory的方法时会导致属性错误
答案 0 :(得分:1)
你是正确的connectTCP
和endpoint.connect
在功能上是相同的(大部分)。
假设TelnetProtocol
是twisted.conch.telnet.TelnetProtocol
,这里的问题是TelnetProtocol
实际上不应该直接连接到TCP传输,它应该连接到twisted.conch.telnet.TelnetTransport
。您所看到的dataReceived
中的“乱码”是实际的telnet协议字节,应该由twisted.conch.telnet.TelnetTransport
(本身为IProtocol
)进行解析以便调用enableLocal
上的enableRemote
和TelnetTransport
等方法。{/ p>
我想在您基于connectTCP
的示例中,您可能正在实例化TelnetTransport
并将其 .protocol
属性设置为指向{{} 1}}。
基本上,请确保您传入的TelnetProtocol
对象与您正在使用的Factory
完全相同的protocol
属性你的ClientFactory
例子。
将来,还请包含完整的,可运行的代码示例,以便我们可以运行它们,看看会发生什么而不是猜测: - )。