私の目標は、 TCP4ClientEndpoint
実装ごとにエンドポイントとしてtelnetクライアントを作成することです。
私は何をしているのですか?
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
の出力を読むことができますが、それはgiberishです。
telnetクライアントは、 Factory
で構築され、 Factory
で reactor.connectTCP(...)
が呼び出されたときに期待通りに機能します。
私はここで間違っているのは何ですか?
ありがとう!
EDIT 1 connecting TelnetClient
to factory.protocol
via 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
EDIT 2 solved. The final piece was ClientFactory.
class TelnetClient( TelnetProtocol ):
...
factory = ClientFactory()
factory.protocol = TelnetTransport( TelnetClient )
point = TCP4ClientEndpoint( reactor, x.x.x.x, 23 )
defer = point.connect( factory )
この問題を解決するには2つの方法がありました。
-
Telnetクライアントが必要なので、プロトコルが TelnetProtocol
のインスタンスであることを確認する必要があります。
-
工場は ClientFactory
である必要があります。 twisted.internet.endoints
のソースを見ると、エンドポイントに渡すファクトリは _WrappingFactory
にラップされています。これは ClientFactory
。このファクトリが渡すファクトリが ClientFactory
と同じ属性でない場合、 _wrappedFactory
はClientFactoryのメソッドを呼び出そうとするとAttributeErrorsを発生させます