2013-11-26 64 views
0

工作我已經爲這每8秒後,一些數據發送到服務器並按照客戶下面的代碼是我的代碼扭曲self.transport.write內環路

class EchoClient(LineReceiver): 
    def connectionMade(self): 
     makeByteList() 
     self.transport.write(binascii.unhexlify("7777")) 

     while 1: 
      print "hello" 
      lep = random.randint(0,4) 
      print lep 
      print binascii.unhexlify(sendHexBytes(lep)) 
      try: 
       self.transport.write("Hello") 
       self.transport.write(binascii.unhexlify(sendHexBytes(lep))) 
      except Exception, ex1: 
       print "Failed to send" 
      time.sleep(8) 

    def lineReceived(self, line): 
     pass 

    def dataReceived(self, data): 
     print "receive:", data 

內循環的同時執行,除了自身的每一個表態.transport.write。服務器不會收到任何數據。另外self.transport.write外while循環不執行。在這兩種情況下都不會引發異常,但是如果我刪除while循環,則外部語句正確執行。這是爲什麼發生?請糾正我錯誤的地方?

回答

2

扭曲的所有方法是異步。所有的方法如connectionMadelineReceived都發生在同一個線程上。 Twisted反應器運行一個循環(稱爲事件循環),並在這些事件發生時調用諸如connectionMadelineReceived的方法。

您在connectionMade中有無限循環。一旦Python進入該循環,它就永遠不會離開。當連接建立時,扭曲的呼叫connectionMade,並且您的代碼永遠保持在那裏。 Twisted沒有機會真正將數據寫入傳輸,或接收數據,它卡在connectionMade

當您編寫Twisted代碼時,您必須瞭解的重要一點是您可能不會在Twisted線程上使用。例如,假設我想在客戶端連接4秒後發送「Hello」。我可能會這樣寫:

class EchoClient(LineReceiver): 
    def connectionMade(self): 
     time.sleep(4) 
     self.transport.write("Hello") 

但這是錯誤的。如果兩個客戶端同時連接會發生什麼?第一個客戶端將進入connectionMade,我的程序將掛起4秒鐘,直到發送「Hello」。

的扭曲的方式做這將是這樣的:

class EchoClient(LineReceiver): 
    def connectionMade(self): 
     reactor.callLater(4, self.sendHello) 

    def sendHello(self): 
     self.transport.write("Hello") 

現在,當扭曲進入connectionMade,它在將來調用reactor.callLater時間表事件4秒。然後它退出connectionMade並繼續做所有其他需要做的事情。在掌握異步編程的概念之前,您無法繼續使用Twisted。我建議你通讀Twisted docs here

最後,一個無關的注意:如果你有一個LineReceiver,你不應該實現你自己的dataReceived,它會使lineReceived不被調用。 LineReceiver是一個協議,它實現了自己的dataReceived,它將數據緩衝並分解成行,並調用lineReceived方法。

+0

感謝您清除扭曲的基礎知識。 – prattom