Twisted,'connectionMade'如何触发特定的延迟?
这是一个更大的程序的一部分;我只会解释相关部分。基本上,我的代码想创建一个到远程主机的新连接。这应该返回一个Deferred,一旦连接建立就会触发,所以我可以发送一些信息。Twisted,'connectionMade'如何触发特定的延迟?
我正在创建与twisted.internet.interfaces.IReactorSSL.connectSSL
的连接。在我的ClientFactory
实例上调用buildProtocol
以获取新连接(twisted.internet.protocol.Protocol
)对象,并返回twisted.internet.interfaces.IConnector
。当连接开始时,Twisted在工厂呼叫startedConnecting
,给它IConnector
。当实际建立连接时,将调用协议的connectionMade
回调,不带任何参数。
现在,如果我只需要每个主机/端口一个连接,其余的将很容易。在调用connectSSL
之前,我会创建一个Deferred,并将其放在键入(主机,端口)的字典中。然后,在协议的connectionMade中,我可以使用self.transport.getPeer()
来检索主机/端口,使用它来查找Deferred并发出它的回调。但是如果我想创建多个连接,这显然会失效。
问题是,我看不到任何其他方式将调用connectSSL
之前创建的延迟I创建与稍后的connectionMade
关联。
看着这一点,我想我已经想出了一个解决方案,但希望有更好的方法;这看起来很奇怪。
Twisted有一个类,ClientCreator
,用于生产简单的单次使用连接。它在理论上做我想要的;连接并返回建立连接时触发的Deferred
。不过,我不认为我可以使用它,因为我失去了将参数传递给协议构造函数的能力,因此无法在连接之间共享状态。
但是,我刚刚意识到ClientFactory
构造函数确实接受*args
传递给协议构造函数。或者至少它看起来像;这几乎没有文件。在这种情况下,我可以参考我的工厂(或其他任何工厂,如果不再需要)。然后我找回建立连接时触发的Deferred
。