t.c.telnetでエンドポイントを構築する方法

私の目標は、 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つの方法がありました。

  1. Telnetクライアントが必要なので、プロトコルが TelnetProtocol のインスタンスであることを確認する必要があります。

  2. 工場は ClientFactory である必要があります。 twisted.internet.endoints のソースを見ると、エンドポイントに渡すファクトリは _WrappingFactory にラップされています。これは ClientFactory 。このファクトリが渡すファクトリが ClientFactory と同じ属性でない場合、 _wrappedFactory はClientFactoryのメソッドを呼び出そうとするとAttributeErrorsを発生させます

2

1 答え

connectTCP endpoint.connect が機能的に同じであることは間違いありません。

TelnetProtocol twisted.conch.telnet.TelnetProtocol であると仮定すると、 TelnetProtocol は実際にはTCP転送に直接接続していないそれは twisted.conch.telnet.TelnetTransport に接続することになっています。表示されている dataReceived の "ぎこちなし"は、実際のTelnetプロトコルバイトであり、 twisted.conch.telnet.TelnetTransport によって解析されるはずです。 TelnetTransport enableLocal enableRemote のようなメソッドを呼び出すために、 IProtocol

あなたの TelnetTransport をインスタンス化してその .protocol を設定していると思われます。属性が TelnetProtocol を指すようにします。

基本的には、渡している Factory オブジェクトが ClientFactory と同じ protocol 属性を正確に >あなたの connectTCP の例で使用しています。

将来的には、完全な実行可能なコード例を含めて、それらを実行し、推測よりも何が起きるかを見てください:-)。

1
追加された
TelnetTransportを使用しているconnectTCPバージョンImでは右です。私がこの質問を投稿する前に、エンドポイントと同じものを実装しようとしました。私の編集をチェックしてください。問題は、NonetypeにconnectionLostがないというAttributeErrorが発生していることです。私はあなたがまだ示唆しているように属性を比較します。私のコードは今ではハッキングされているので、朝は午前中に実行される例を投稿してください(朝から私:))
追加された 著者 sbartell,
FactoryオブジェクトがClientFactoryと同じ属性を持つことを保証することで解決される問題。編集をチェックしてください。
追加された 著者 sbartell,
助けてくれてありがとう!
追加された 著者 sbartell,