exceptions.AttributeError:EchoFactory实例没有属性' connection'

时间:2015-04-03 17:27:37

标签: python twisted

首先,我想说的是我刚刚开始使用python和twisted,所以即使是在搜索我遇到的所有错误和疑问,我确信我仍然会产生一些愚蠢的错误。

说,我正在使用这个客户端 - 服务器对,客户端将模拟一个监听循环,以了解设备是否已连接到它,然后用它向服务器发送一条消息。参数。

首先我创建连接,然后启动循环,然后在设备连接后发送文件(您将在代码底部看到注释)。现在我要做的是在设备连接到客户端时(在LoopingCall调用的函数内)创建连接,这就出现了问题,因为它抛出了你在标题中看到的异常。

这是客户端代码,它给我带来了麻烦。

from twisted.internet import reactor, protocol
from twisted.internet.task import LoopingCall
import gri
import os

ID = '1258'
filename = 'parameters.xml'
a = 1;
reg = 0;
xreg = 0;
xdreg = 0;

#Create the radio object
radio = gri.Radio()

class EchoClient(protocol.Protocol):
    def connectionMade(self):
        self.transport.write(ID)
    def sendXML(self):
        f = open(filename,'r')
        self.transport.write(f.read())
        f.close()   

class EchoFactory(protocol.ClientFactory):
    def buildProtocol(self, addr):
        self.connection = EchoClient()
        return self.connection
    def clientConnectionFailed(self, connector, reason):
        print "Connection failed."
        reactor.stop()
    def clientConnectionLost(self, connector, reason):
        print "Connection lost."
        reactor.stop()

#listening loop
def find_usrp():
    global a
    global reg
    global xreg
    global xdreg
    global factory
    # a=0 if the device is connected, a=1 if not
    a = radio.findRadio()
    if a == 0:
        reg = 1
        if xreg == 0:
            #creating the connection once the device is connected
            factory = EchoFactory()     
            reactor.connectTCP("localhost",8000, factory)
            factory.connection.sendXML()            
            xreg = 1
            xdreg = 0
    else:
        print "Device is not connected"
        if reg == 1:
            print "Device is out"
            if xdreg == 0:
                xdreg = 1
                xreg = 0

#creating the connection before the loop
#factory = EchoFactory()    
#reactor.connectTCP("localhost",8000, factory)
LoopingCall(find_usrp).start(1, now = False)
reactor.run()

这就是它,我不知道为什么当它进入factory.connection.sendXML()它没有找到连接。我一直在尝试不同的事情,例如将工厂作为find_usrp函数的参数,改变一些地方,但我担心我没有足够的知识来掌握这种语言的真实情况。 ..让我们看看你是否可以帮助我,这样我才能真正了解它。谢谢!


编辑:

到目前为止,eighilaza所说的对我有意义,我已经尝试过这条线 factory.connection.sendXML() 一段时间之后它似乎有效,所以也许我试图在它创建之前运行这个功能。但有没有办法控制这个?

1 个答案:

答案 0 :(得分:3)

导致错误的原因是您在建立连接之前调用factory.connection。

在您的代码中reactor.connectTCP("localhost",8000, factory)是非阻止的,因此您可以在建立连接之前到达factory.connection.sendXML()