2013-04-18 100 views
5

我創建這樣我連接到服務器:我如何檢查是否twisted.internet.protocol實例已經斷開

connection = TCP4ClientEndPoint(reactor, server_host, server_port) 
factory = Factory() 
factory.protocol = Protocol 
protocol = yield connection.connect(factory) 
protocol.doSomething()  # returns a deferred 

現在,在一些其他的方法,在這裏我有這個協議對象的句柄我想測試協議是否仍然連接,如:

if protocol.isConnected(): 
    doSomethingElse() 

有沒有什麼辦法可以做到這一點。我看着扭曲的文檔,並找不到相關的方法。在connectionLost()回調中設置一個標誌是一個選項,但我想知道是否可以避免這樣做。

回答

6

Twisted試圖在存儲狀態時儘可能輕。就像光禿禿的工廠完全沒有跟蹤他們的孩子一樣,Protocols對自己知之甚少。他們大多是回叫包。

connectionLost()方法中設置標誌是實現它的方法。對於未來的參考:

from twisted.internet.protocol import Protocol 

class StatefulProtocol(Protocol): 
    def __init__(self, factory): 
     self.connected = False 

    def connectionMade(self): 
     self.connected = True 

    def connectionLost(self, reason): 
     self.connected = False 

編輯:注意,有一個原因,這種感覺不舒服。如果你有一個方法需要問這個問題,你可能在回調鏈之外工作。如果您僅在Protocol公開的生命週期方法內運行代碼,則可能不需要此代碼。

+0

謝謝!我對扭曲的設計實踐不是很熟悉。通過生命週期方法,你的意思是我應該在connectionMade()回調中完成所有工作,並且不需要明確調用類似protocol.doSomething()的東西? – AnkurVj

+1

是的。通過在回調方法中運行所有必要的行爲,您可以避免跟蹤狀態(通常容易出錯),因爲您只需在需要完成的時候執行操作。請注意,這是**可取的**,但並不總是**可能的**。有些設計只需要像上面這樣的標誌。儘量避免它,但不要破壞你的代碼庫,試圖按照最佳做法:) – slezica

+0

的確。我發現很難在回調中做到這一切!例如,我必須在連接之後和協議對象做任何事情之前給協議對象一些額外的變量,但不知道該怎麼做!我必須執行'protocol.val = val',然後顯式調用'protocol.doSomething()'而不是在'connectionMade()'中調用'self.doSomething()'回調 – AnkurVj

相關問題