这是一个更大的计划的一部分;我只会解释相关部分。基本上,我的代码想要创建一个到远程主机的新连接。这应该返回一个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
关联。
答案 0 :(得分:0)
再看看这个,我想我已经提出了一个解决方案,尽管希望有更好的方法;这看起来很奇怪。
Twisted有一个类ClientCreator
,用于生成简单的一次性连接。它在理论上做我想要的;连接并返回在建立连接时触发的Deferred
。我不认为我可以使用它,因为我失去了将参数传递给协议构造函数的能力,因此无法在连接之间共享状态。
但是,我刚刚意识到ClientFactory
构造函数确实接受*args
传递给协议构造函数。或者至少看起来像它;几乎没有这方面的文件。在这种情况下,我可以给它一个参考我的工厂(或其他任何,如果不再需要工厂)。然后我回到建立连接时触发的Deferred
。