2013-11-03 16 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'方法。 :)如果你想要超越这个范围的帮助,一个新的问题可能是一条可行的路。 –