2009-02-20 30 views
2

這是一個更大的程序的一部分;我只會解釋相關部分。基本上,我的代碼想創建一個到遠程主機的新連接。這應該返回一個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關聯。

回答

0

看着這一點,我想我已經想出了一個解決方案,但希望有更好的方法;這看起來很奇怪。

Twisted有一個類,ClientCreator,用於生產簡單的單次使用連接。它在理論上做我想要的;連接並返回建立連接時觸發的Deferred。不過,我不認爲我可以使用它,因爲我失去了將參數傳遞給協議構造函數的能力,因此無法在連接之間共享狀態。

但是,我剛剛意識到ClientFactory構造函數確實接受*args傳遞給協議構造函數。或者至少它看起來像;這幾乎沒有文件。在這種情況下,我可以參考我的工廠(或其他任何工廠,如果不再需要)。然後我找回建立連接時觸發的Deferred