2015-04-03 37 views
3

首先,我想说,我刚刚开始使用Python和扭曲,所以即使在搜索我所有的错误和疑惑,我确信我仍然可以制作一些愚蠢的。exceptions.AttributeError:EchoFactory实例没有属性'连接'

说,我正在处理这个客户端 - 服务器对,客户端将模拟一个侦听循环来知道设备是否连接到它,然后用它的参数向服务器发送消息。

首先我创建连接,然后启动循环,然后在设备连接后发送文件(您会在代码的底部看到该注释)。现在我想要做的是在设备连接到客户端时(在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() 一段时间,似乎它的工作原理,所以也许我想在创建之前运行此功能。但是有什么办法可以控制这个吗?

+0

欢迎来到SO:SE。你是什​​么意思*它没有找到连接*?是否有一些错误信息可以帮助解答? – mins 2015-04-03 17:36:13

+0

谢谢!错误消息是在标题中出现的错误信息:“exceptions.AttributeError:EchoFactory实例没有属性'connection'”,当代码在find_usrp函数内部达到“factory.connection.sendXML()”时被抛出 – josepmeg 2015-04-03 20:24:27

回答

3

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

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

相关问题