Как построить конечные точки с помощью 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 )
Решение этой задачи было двояким.
  1. Поскольку нам нужен клиент telnet, мы должны убедиться, что протокол является экземпляром TelnetProtocol.

  2. Фабрика должна быть из ClientFactory. Если мы посмотрим на источник twisted.internet.endoints, мы увидим, что фабрика, которую мы передаем в конечные точки обернуты в _WrappingFactory, который происходит от ClientFactory. Если эта фабрика, которую мы передаем, не имеет тех же атрибутов, что и ClientFactory, то _wrappedFactory вызовет AttributeErrors, когда он попытается вызвать методы ClientFactory

1 2

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 атрибут указывает на A TelnetProtocol.

В принципе, убедитесь, что объект Factory, который вы передаете, имеетточно тот же атрибут protocol, что и ClientFactory, который вы используете в своем примере connectTCP.

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