Моя цель - создать клиентов telnet в качестве конечных точек для реализации TCP4ClientEndpoint
.
Вот что я делаю:
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
вызовет AttributeErrors при попытке вызвать методы ClientFactory