0

Twisted フレームワークに基づく P2P アプリケーションに取り組んでいます。そのため、着信接続と発信接続の両方を使用できます。それらを区別する簡単な方法はありますか?現在、接続を発信としてマークし、すべてのファクトリ呼び出しを元のファクトリに委任する別のファクトリを作成するだけですが、もっと簡単な方法が必要です。

class OutgoingProtocolFactory(MyProtocolFactory):
    """
    A rather simple factory that is used to earmark connections as outgoing.
    """
    def __init__(self, parentFactory):
        self.factory = parentFactory

    def buildProtocol(self, addr):
        connection = MyProtocolFactory.buildProtocol(self.factory, addr)
        connection.factory = self.factory
        connection.incoming = False
        return connection

    def clientConnectionFailed(self, connector, reason):
        self.factory.clientConnectionFailed(connector, reason)

    def clientConnectionLost(self, connector, reason):
        self.factory.clientConnectionLost(connector, reason)

何かご意見は?

4

1 に答える 1

0

Twisted に含まれるファクトリのいずれかによって構築された各プロトコル インスタンスは、factoryそれらを作成したファクトリを参照する自由な属性を取得します。

慣例により、受け入れられた (サーバー) 接続にはServerFactoryファクトリとして (またはサブクラス) インスタンスがあり、接続された (クライアント) 接続にはClientFactory(またはサブクラス) インスタンスがあります。

ただし、コードを完全に一般的なものにしたい場合は、これに頼ることはできません。現在行っているように聞こえるので、自分で追跡することをお勧めします。

あるファクトリから別のファクトリへの呼び出しを転送するために現在持っているコードが必要以上に面倒な場合は、次の例を参考にしてください。

from twisted.internet.protocol import ClientFactory
from twisted.protocols.policies import WrappingFactory

IN, OUT = 1, 2

class YourFactory(ClientFactory):
    # Your application logic
    ...

class Incoming(WrappingFactory):
    direction = IN

    def buildProtocol(self, addr):
        protocol = self.wrappedFactory.buildProtocol(addr)
        protocol.direction = self.direction
        return protocol

class Outgoing(Incoming):
    direction = OUT

yourFactory = YourFactory(...)
reactor.listenTCP(0, Incoming(yourFactory))
reactor.connectTCP('example.com', 1234, Outgoing(yourFactory))

それでも複雑すぎる場合は、何を言えばいいのかわかりません。私はもっ​​と簡単な解決策を考えるほど賢くありません。

于 2012-07-23T19:23:03.953 に答える