【问题标题】:Distinguishing outgoing and incoming connections in twisted区分双绞线中的传出和传入连接
【发布时间】:2012-07-23 11:42:45
【问题描述】:

我正在开发基于 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 能告诉我连接是来自我这边的 connectTCP 还是来自 listenTCP 在这种情况下它会传入,那就太好了。

标签: python twisted


【解决方案1】:

由 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))

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

【讨论】:

  • 既然我提供了这些工厂,你的意思是,实际上要走的路是拥有两个独立的工厂(一个用于监听,一个用于打开传出连接)然后自己桥接它们(就像我做的那样只需将所有其他呼叫重定向到其中一个工厂)。我相信一定有一个更简单的方法。
  • 从您的问题中并不清楚您对传入和传出连接使用相同的工厂实例。不过,我仍然认为您当前的方法是正确的。也许您只需要一种更简单的方法来实现该方法?我会用一个建议来编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多