这是一个较大程序的一部分;我将仅解释相关部分。基本上,我的代码想创建到远程主机的新连接。这应该返回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,并触发其回调。但是,如果我要创建多个连接,这显然会失败。

问题是,在以后调用connectSSLconnectionMade之前,我看不到任何其他方式将我创建的Deferred与之关联。

最佳答案

进一步看一下,我想我已经提出了一个解决方案,尽管希望有更好的方法。这似乎很奇怪。

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

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

关于python - 使用Twisted,“connectionMade”如何触发特定的Deferred?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/570397/

10-13 02:39