2013-11-03 18 views
1

我試圖用Twisted發送和接收UDP消息,發送完每條消息之後我希望從網絡中的其他節點接收相同的消息,然後通過一些回調改變「sender」字符串的值,然後發送消息以新的價值。我想我應該停下來,並開始使用數據報協議的新實例,波紋管代碼是我的模板,我想更改heartBeatSenderObj的「發件人」值,然後期望基於此值的未來數據包的新值,但我找不到它的樣子,我明白任何建議和幫助:如何更新Twisted中UDP協議實例的值?

from twisted.internet.protocol import DatagramProtocol 
from twisted.internet import reactor 
from twisted.internet.task import LoopingCall 
import sys, time 

class HeartbeatSender(DatagramProtocol): 
    def __init__(self, name, host, port): 
     self.name = name 
     self.loopObj = None 
     self.host = host 
     self.port = port 

    def startProtocol(self): 
     # Called when transport is connected 
     # I am ready to send heart beats 
     self.loopObj = LoopingCall(self.sendHeartBeat) 
     self.loopObj.start(2, now=False) 

    def stopProtocol(self): 
     "Called after all transport is teared down" 
     pass 

    def datagramReceived(self, data, (host, port)): 
     print "received %r from %s:%d" % (data, host, port) 


    def sendHeartBeat(self): 
     self.transport.write(self.name, (self.host, self.port)) 



class HeartbeatReciever(DatagramProtocol): 
    def __init__(self): 
     pass 

    def startProtocol(self): 
     "Called when transport is connected" 
     pass 

    def stopProtocol(self): 
     "Called after all transport is teared down" 


    def datagramReceived(self, data, (host, port)): 
     now = time.localtime(time.time()) 
     timeStr = str(time.strftime("%y/%m/%d %H:%M:%S",now)) 
     print "received %r from %s:%d at %s" % (data, host, port, timeStr) 



heartBeatSenderObj = HeartbeatSender("sender", "127.0.0.1", 8005) 

reactor.listenMulticast(8005, HeartbeatReciever(), listenMultiple=True) 
reactor.listenMulticast(8005, heartBeatSenderObj, listenMultiple=True) 
reactor.run() 
+0

「刺痛」在您的源代碼中無處可見。也許你犯了一個編輯錯誤? –

+0

謝謝你,你是對的這是編輯問題,當時我發佈這個問題,現在它是固定的,我的意思是我的觀點是改變第一個參數傳遞給heartBeatSenderObj,這是「發件人」,實際上它只是一個字符串,可能它可能是任何東西。 – DeFoG

回答

1

這個怎麼樣定義的datagramReceived

class HeartbeatSender(DatagramProtocol): 
    ... 
    def datagramReceived(self, data, (host, port)): 
     print "received %r from %s:%d" % (data, host, port) 
     if data.startswith("change name:"): 
      self.name = data[len("change name:"):] 

換句話說,HeartbeatSender只是一個普通的Python類,datagramReceived只是一個普通的該類的方法,而name只是一個常規屬性你擁有該類的實例。事情就像在Python的其他地方工作一樣。

+0

我真的很感激你,你爲我節省了很多時間,我一直在想這個,但由於某種原因,我想這麼複雜,無法弄清楚,你的觀點非常精確和真棒。另一個問題是如何完全阻止發件人,我的意思是強制停止發件人。再次感謝你的幫助。 – DeFoG

+1

阻止它發送心跳? 'LoopingCall'有一個'stop'方法。 :)如果你想要超越這個範圍的幫助,一個新的問題可能是一條可行的路。 –