python - 异常.AttributeError : EchoFactory instance has no attribute 'connection'

标签 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() 一段时间后,它似乎可以工作,所以也许我正在尝试在创建之前运行此功能。但是有什么办法可以控制吗?

最佳答案

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

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

关于python - 异常.AttributeError : EchoFactory instance has no attribute 'connection' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29436935/

相关文章:

python - 分层排序数据

python - Odoo 不显示 xpath 中的字段标签

python - 如何消除“sys.excepthook丢失”错误?

python - 将基于 python-twisted 的代码移植到 scala : framework advice needed

python - 在 Windows 上运行 Portia (scrapy)

python - 扭曲: `defer.execute` 和 `threads.deferToThread` 之间的区别

python - 中央操作系统 : Two Versions of Python and Packages

python - 如何根据 CPU 的限制处理多进程

python - 查找两个或多个以 upper 开头的连续单词并替换为它们的缩写(正则表达式)

python - 测试扭曲的应用程序 - 加载客户端