1

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

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()
4

1 回答 1

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 中的任何其他地方工作一样。

于 2013-11-03T17:19:08.600 回答