代码之家  ›  专栏  ›  技术社区  ›  DNS

对于twisted,“connectionmade”如何触发特定的延迟?

  •  2
  • DNS  · 技术社区  · 16 年前

    这是一个更大计划的一部分;我只解释相关部分。基本上,我的代码希望创建到远程主机的新连接。这应该返回一个延迟的,一旦建立了连接,它就会触发,所以我可以在它上面发送一些东西。

    我正在创建与 twisted.internet.interfaces.IReactorSSL.connectSSL . 那个电话 buildProtocol 在我身上 ClientFactory 获取新连接的实例( twisted.internet.protocol.Protocol )对象,并返回 twisted.internet.interfaces.IConnector . 当连接启动时,扭曲的呼叫 startedConnecting 在工厂,给它 IConnector . 当实际建立连接时,协议 connectionMade 调用了回调,没有参数。

    现在,如果每个主机/端口只需要一个连接,其余的连接就很容易了。打电话之前 connectSSL ,我将创建一个延迟的,并将其放入键入的字典(主机、端口)。然后,在协议的连接中,我可以使用 self.transport.getPeer() 要检索主机/端口,请使用它查找延迟的,并启动其回调。但如果我想创建多个连接,这显然会失败。

    问题是我看不到任何其他方法来关联我在调用之前创建的延迟 连接器 连接制造 后来。

    1 回复  |  直到 16 年前
        1
  •  0
  •   DNS    16 年前

    再多看一看,我想我已经想出了一个解决办法,虽然希望有更好的方法;这看起来有点奇怪。

    Twisted有一个班级, ClientCreator 用于生成简单的一次性连接。理论上它做我想要的;连接并返回 Deferred 在建立连接时激发。不过,我认为我不能使用它,因为我将失去向协议构造函数传递参数的能力,因此无法在连接之间共享状态。

    但是,我才意识到 ClientFactory 构造函数不接受 *args 传递到协议构造函数。或者至少看起来是这样;实际上没有相关的文档。在这种情况下,我可以给它一个参考我的工厂(或其他任何,如果工厂不再需要)。然后我回来 推迟 在建立连接时激发。