Как построить конечные точки с помощью T. C. telnet
Моя цель-создать клиентов 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.
Что же я делаю не так? - здесь?
Спасибо!
EDIT 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
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.Я можно предположить, что в вашем примере
connectTCPвы, вероятно, создаете экземплярTelnetTransportи устанавливаете его.protocolатрибут указывает на ATelnetProtocol.В принципе, убедитесь, что объект
Factory, который вы передаете, имеетточно тот же атрибутprotocol, что иClientFactory, который вы используете в своем примереconnectTCP.В будущем также, Пожалуйста, включите полные, запускаемые примеры кода, чтобы мы могли запускать их и видеть, что происходит, а не гадать: -).