代码之家  ›  专栏  ›  技术社区  ›  DeFoG Jean-Paul Calderone

如何更新Twisted中UDP协议实例的值?

  •  1
  • DeFoG Jean-Paul Calderone  · 技术社区  · 12 年前

    我试图用Twisted发送和接收UDP消息,在发送每条消息后,我希望从网络中的其他节点接收相同的消息,然后通过一些回调更改“sender”字符串的值,然后用新的值发送消息。我认为我应该停止并用数据报协议的新实例启动它,下面的代码是我的模板,我想更改heartBeatSenderObj的“sender”值,然后期望基于此为未来的数据包提供新的值,但我找不到方法,我很感激任何建议和帮助:

    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()
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   DeFoG Jean-Paul Calderone    12 年前

    这个定义怎么样 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类, 收到的数据报 只是该类上的一个常规方法,并且 name 只是该类的实例的常规属性。这里的工作原理和Python中其他任何地方的工作原理一样。