在扭曲中区分传出和传入连接

时间:2012-07-23 11:42:46

标签: python twisted

我正在开发基于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)

有什么想法吗?

1 个答案:

答案 0 :(得分: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))

如果这对你来说仍然太复杂,那么我不知道该说些什么。我不够聪明,想到一个更简单的解决方案。