Как построить конечные точки с помощью 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
.В будущем также, Пожалуйста, включите полные, запускаемые примеры кода, чтобы мы могли запускать их и видеть, что происходит, а не гадать: -).