2

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

问题是我看不到任何其他方法可以将我在调用之前创建的 DeferredconnectSSLconnectionMade稍后创建的关联。

4

1 回答 1

0

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

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

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

于 2009-02-20T17:39:22.943 回答