Python 区分twisted中的传出和传入连接

Python 区分twisted中的传出和传入连接,python,twisted,Python,Twisted,我正在开发一个基于Twisted框架的P2P应用程序。因此,我可以有传入和传出连接。有没有一种简单的方法来区分它们?目前,我只是创建另一个工厂,将连接标记为传出,并将所有工厂调用委托给原始工厂,但必须有一种更简单的方法 class OutgoingProtocolFactory(MyProtocolFactory): """ A rather simple factory that is used to earmark connections as outgoing. "

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

有什么想法吗?

Twisted中包含的任何工厂构造的每个协议实例都可以获得一个免费的
工厂
属性,该属性引用创建它们的工厂

按照惯例,接受的(服务器)连接有一个
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))

如果这对你来说还是太复杂了,那么我不知道该说什么。我还没有聪明到想出一个更简单的解决方案。

插座就是插座就是插座。。。也就是说,无法区分通过接受连接或通过连接到远程程序创建的套接字。唯一的方法就是像你现在一样自己跟踪它。是的,我知道,但现在我正在使用另一个工厂,它只会将其标记为未进入,即离开,并将所有其他内容委托给原始工厂,这似乎很愚蠢。如果twisted能告诉我连接是来自我这边的connectTCP,还是来自listenTCP,那就太好了。因为我提供了这些工厂,你说的方法实际上是拥有两个独立的工厂(一个用于监听,一个用于打开传出连接),然后自己桥接它们(就像我把所有其他的电话转接到一家工厂)。我相信一定有更简单的方法。从您的问题中不太清楚您使用的是相同的工厂实例进行传入和传出连接。不过,我仍然认为您当前的方法是正确的。也许您只需要一种更简单的方法来实现该方法?我将编辑我的答案并提出建议。