2015-09-02 82 views
1

我使用Twisted創建TCP客戶端套接字。我需要在connectionMade方法的循環間隔中檢查連接狀態。Python - 扭曲客戶端 - 在ping迴路中檢查protocol.transport連接

from twisted.internet import reactor, protocol 

class ClientProtocol(protocol.Protocol): 
    def connectionMade(self): 
     while not thread_obj.stopped.wait(10): 
      print ('ping') 
      self.transport.write(b'test') # Byte value 

對於檢查連接失敗,我手動斷開我的網絡,我以後查了一些變量波紋管:

print (self.connected) 
print (self.transport.connector.state) 
print (self.transport.connected) 
print (self.transport.reactor.running) 
print (self.transport.socket._closed) 
print (self.factory.protocol.connected) 
print (self._writeDissconnected) 

但是,任何變量值斷開我的網絡後,並沒有改變:(

我的問題是:當連接丟失時會設置哪些變量?我的意思是如何檢查連接狀態,如果斷開連接,我該如何重新連接?

+1

''connectionMade'裏面做的while循環是什麼?它是否阻止'connectionMade'返回? – keturn

+0

@keturn感謝您的關注,'connectionMade'內的循環用於檢查或ping連接,並在連接丟失時通知。此循環不會阻止返回。但是我打印的值在從服務器斷開連接後從未更改過。我需要知道如何檢查連接狀態,如果斷開連接,我該如何重新連接? –

回答

1

覆蓋connectionLost捕捉斷開的方法。 to official docs

編輯關於重新連接: 重新連接大多是一個合理的決定。你可能想在'connectionLost'和'reconnect'之間添加邏輯。

無論如何, 您可以使用ReconnectingClientFactory更好的代碼。 ps:在重新連接時使用工廠模式是保持代碼清潔和智能的最佳方式。

class MyEchoClient(Protocol): 
    def dataReceived(self, data): 
     someFuncProcessingData(data) 
     self.transport.write(b'test') 

class MyEchoClientFactory(ReconnectingClientFactory): 
    def buildProtocol(self, addr): 
     print 'Connected.' 
     return MyEchoClient() 

    def clientConnectionLost(self, connector, reason): 
     print 'Lost connection. Reason:', reason 
     ReconnectingClientFactory.clientConnectionLost(self, connector, reason) 

    def clientConnectionFailed(self, connector, reason): 
     print 'Connection failed. Reason:', reason 
     ReconnectingClientFactory.clientConnectionFailed(self, connector, 
                reason) 
+0

感謝您的回覆。你的意思是我不需要檢查間隔循環中的連接?你的意思是如果連接丟失,'connectionLost'方法將自動調用?如果這是真的,我該如何重新連接?如果你給我示例代碼或參考:) –

+0

是的。你會忘記用扭曲的方式使用循環:D – cengizkrbck