2015-04-03 61 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()

相關問題