使用Twisted,“connectionMade”如何触发特定的Deferred?

时间:2009-02-20 17:03:49

标签: python connection twisted reactor

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

我正在创建与twisted.internet.interfaces.IReactorSSL.connectSSL的连接。这会在buildProtocol实例上调用ClientFactory以获取新连接(twisted.internet.protocol.Protocol)对象,并返回twisted.internet.interfaces.IConnector。连接开始后,Twisted在工厂调用startedConnecting,并为其IConnector。当实际建立连接时,调用协议的connectionMade回调,没有参数。

现在,如果我每个主机/端口只需要一个连接,剩下的就很简单了。在调用connectSSL之前,我会创建一个Deferred并将其放在键入的字典中(主机,端口)。然后,在协议的connectionMade中,我可以使用self.transport.getPeer()来检索主机/端口,使用它来查找Deferred,并触发其回调。但是,如果我想创建多个连接,这显然会中断。

问题在于,我无法看到任何其他方式将之前调用connectSSL之前创建的延迟我与connectionMade关联。

1 个答案:

答案 0 :(得分:0)

再看看这个,我想我已经提出了一个解决方案,尽管希望有更好的方法;这看起来很奇怪。

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

但是,我刚刚意识到ClientFactory构造函数确实接受*args传递给协议构造函数。或者至少看起来像它;几乎没有这方面的文件。在这种情况下,我可以给它一个参考我的工厂(或其他任何,如果不再需要工厂)。然后我回到建立连接时触发的Deferred