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相同的属性的问题已经解决。查看编辑。