Как построить конечные точки с помощью tctelnet - PullRequest
2 голосов
/ 28 октября 2011

Моя цель - создать клиентов 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 )

Решение этой проблемы было двояким.

  1. Поскольку нам нужен клиент telnet, мы должны убедиться, что протокол является экземпляром TelnetProtocol.

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

1 Ответ

1 голос
/ 28 октября 2011

Вы правы, что 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, чтобы он указывал на TelnetProtocol.

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

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

...