2011-09-10 30 views
3

有我的客戶工廠裏後:扭曲的遞延不可呼叫連接失敗

import logging, traceback 
from twisted.internet.protocol import ClientFactory 
from twisted.internet import defer, reactor, ssl 
from twisted.application import service 
from protocols.smpp.protocol import SMPPClientProtocol 

class SMPPClientFactory(ClientFactory): 

    protocol = SMPPClientProtocol 

    def __init__(self, config): 
     self.config = config 

    def getConfig(self): 
     return self.config 

    def clientConnectionFailed(self, connector, reason): 
     print "clientConnectionFailed" 

     self.connectDeferred.errback(reason) 

    def clientConnectionLost(self, connector, reason): 
     print "clientConnectionLost" 

    def connect(self): 
     self.connectDeferred = defer.Deferred() 
     factory = SMPPClientFactory(self.config, self.msgHandler) 

     self.log.warning('Establishing TCP connection to %s:%d' % (self.config.host, self.config.port)) 
     reactor.connectTCP(self.config.host, self.config.port, factory) 

     return self.connectDeferred 

而且這此推出代碼:

import logging, traceback 
from twisted.internet import reactor, defer 
from protocols.smpp.configs import SMPPClientConfig 
from protocols.smpp.smpp_operations import SMPPOperationFactory 
from testbed.client import SMPPClientFactory 

class SMPP(object): 

    def __init__(self, config=None): 
     if config is None: 
      config = SMPPClientConfig() 

     self.config = config 
     self.opFactory = SMPPOperationFactory(config) 

    def run(self): 
     try: 
      #Bind 
      SMPPClientFactory(self.config, self.handleMsg).connect().addErrback(self.connectFailed) 
     except Exception, e: 
      print "ERROR: %s" % str(e) 

    def connectFailed(self, reason): 
     print "Connection failed %s" % str(reason) 

    def handleMsg(self, smpp, pdu): 
     pass 

if __name__ == '__main__': 
    config = SMPPClientConfig(host='127.0.0.1', port=2775, username='smppclient1', password='password', 
           log_level=logging.DEBUG) 

    logging.basicConfig(level=config.log_level, filename=config.log_file, format=config.log_format,datefmt=config.log_dateformat) 
    SMPP(config).run() 
    reactor.run() 

當連接失敗(遠程服務器已關閉),我獲取工廠的clientConnectionFailed調用,但奇怪地得到一個「exceptions.AttributeError:SMPPClientFactory實例沒有屬性'connectDeferred'」。

我需要調用errback可連接失敗時,似乎有什麼東西與deferreds打交道時失蹤..

回答

2

在你的啓動代碼,您實例化的SMPPClientFactory叫連接()就可以了。這個特定的實例將具有connectDeferred屬性。但是,連接還實例化了另一個SMPPClientFactory:factory = SMPPClientFactory(self.config, self.msgHandler),這是您用來創建實際連接的實例。這沒有connectDeferred屬性,因爲這個實例連接從未被調用過。