2017-12-01 11 views
1

Twistedを使用してプロキシサーバーを作成していますが、サーバーへの接続が切断されたかどうかを確認する際に問題があります。Twistedで接続が閉じられたかどうかを確認

それが今であるように、私は持っている

クライアント< - >プロキシ< - >サーバーのtelnetと

テストは、プロキシが正常にクライアントからサーバーへのメッセージを渡し、およびバックサーバの応答を渡しますクライアントに送信します。しかし、私の問題は、クライアントがプロキシとサーバーの間の接続を閉じるコマンドを発行し、クライアントとプロキシ間の接続が残っている場合です。ここで

は、私はおそらくdataReceivedに、接続の状態を監視し、サーバがそれを閉じたかどうかを確認できるようにしたい私のコードの一部

ラインで
client_factory = protocol.ClientFactory() 
    client_factory.protocol = ClientTelnetProtocol 
    client_factory.proxy = self 

    try: 
     clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     clientsocket.connect(('localhost', 1234)) 
     clientsocket.close() 
     reactor.connectTCP('localhost', 1234, client_factory) 
    except Exception as err: 
     print(err) 
     self.transport.loseConnection() 

reactor.connectTCP('localhost', 1234, client_factory) 

ですサーバーがプロキシへの接続を閉じたときに割り込みを設定し、プロキシがクライアントへの接続をただちに終了させるようにしてください。

答えて

1

ITransportIProtocolプロバイダでconnectionLostを呼び出して、接続喪失イベントをIProtocolに通知します。したがって、そのイベントに反応したい場合は、プロトコルにconnectionLostを実装する必要があります(この場合はClientTelnetProtocolと表示されます)?アプリケーションロジックをそのメソッドに置きます。この方法は、ITransportの実装が接続が失われていることを知ったらすぐに呼び出されます(必要に応じての割り込みはではないことに注意してください)。Twistedは(主に)シングルスレッドの協調マルチタスクシステムです。 (例えば、clientsocket.connect)をブロックするアプリケーションコードがあります。Twistedは、完了してリアクトルが制御を取り戻すまでコールバックのいずれかを呼び出しませんが、チャンスが与えられると直ちに、接続connectionLostなど)

サンプルコードでsocketモジュールを直接使用して、宛先アドレスへの接続を直接破棄する理由を理解できません。私の推測では、サーバーが接続を受け入れるかどうかを判断しようとしています。この場合、socketモジュールを使用して例外をチェックするのではなく、reactor.connectTCPが試みた接続が失敗したことを検出するには、the ClientFactory method clientConnectionFailedを使用します。 Twisted's endpoint abstractionを使用して、代わりにDeferredコールバックとしてこの通知を受け取ることもできます。

Tubesさらに興味深いことがありますが、データフローよりもさらに高度な抽象化を提供します。

+0

これはまさに私がやろうとしていたものでしたが、私はclientConnectionFailedメソッドを見つけることができませんでした。代わりに、私はちょうどソケットを設定し、失敗する場合は、接続を中止してください。 –

関連する問題