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