Frage

Meine Kundenfabrik hier haben:

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

Und hier wird Code gestartet:

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()

Wenn die Verbindung fehlschlägt (der Remote-Server ist ausgefallen), wird der ClientConnectionFailed der Fabrik aufgerufen, aber seltsamerweise wird eine "Ausnahmen.AttributeError: SMPPClientFactory-Instanz hat kein Attribut 'connectDeferred'".

Ich muss den Errback aufrufen, wenn die Verbindung fehlschlägt. Es scheint, dass beim Umgang mit Verzögerungen etwas fehlt.

War es hilfreich?

Lösung

In Ihrem Startcode haben Sie eine SMPPClientFactory instanziiert und darauf connect () aufgerufen.Diese bestimmte Instanz hat das Attribut connectDeferred.Connect instanziierte jedoch auch eine andere SMPPClientFactory: factory = SMPPClientFactory(self.config, self.msgHandler). Dies ist die Instanz, mit der Sie die eigentliche Verbindung erstellt haben.Dies hat nicht das Attribut connectDeferred, da bei dieser Instanz connect nie aufgerufen wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top