exceptions.AttributeError: EchoFactory instance has no attribute 'connection'
exceptions.AttributeError: EchoFactory instance has no attribute 'connection'
首先,我想说的是,我刚刚开始使用 python 和扭曲,所以即使正在寻找我所拥有的所有错误和疑虑,我确信我仍然可以产生一些愚蠢的东西一个。
说,我正在研究这个 client-server 对,客户端将模拟一个监听循环以了解设备是否连接到它,然后使用它的参数向服务器发送消息。
首先我创建了连接,然后开始循环,然后在设备连接后发送文件(您会在代码底部看到注释)。现在我要做的是在设备连接到客户端时创建连接(在 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 和扭曲,所以即使正在寻找我所拥有的所有错误和疑虑,我确信我仍然可以产生一些愚蠢的东西一个。
说,我正在研究这个 client-server 对,客户端将模拟一个监听循环以了解设备是否连接到它,然后使用它的参数向服务器发送消息。
首先我创建了连接,然后开始循环,然后在设备连接后发送文件(您会在代码底部看到注释)。现在我要做的是在设备连接到客户端时创建连接(在 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()
。