Python Twisted DatagramProtocol UDP客户端重新连接

2024-10-01 07:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑到我已经用DatagramProtocol在Twisted中实现了一个UDP客户机,并使用它与UDP服务器通信,该服务器一度脱机(由于重新启动-因此它不会更改其IP地址),所以在我的协议中调用stopProtocol,但是Twisted将传输本身设置为None。在

如何解决Twisted中的简单重新连接或重新启动传输? 根据文件,我无法再使用udp连接。在

考虑到在UDP中,即使服务器死了,发送方也应该能够发送数据包,而且协议在数据包中有自己的连接处理,如果传输不会消失,我可以完全通过包层重新连接逻辑部分。在

我想在内核运行时用新协议再次运行listenUDP是行不通的。在

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor


class UDPClientProtocol(DatagramProtocol):
    def __init__(self, host, port):
       self.host = host
       self.port = port

    def startProtocol(self):
       # Called when transport is connected
       self.transport.connect(self.host, self.port)
       self.transport.write('initiate protocol') # pseudo code.

    def stopProtocol(self):
       print "I have lost connection and self.transport is gone!"
       # wait some time and try to reconnect somehow?

 t = reactor.listenUDP(0, UDPClientProtocol('127.0.0.1', 12345))
 reactor.run()

Tags: fromself服务器host协议portdeftwisted
2条回答

有趣。这听起来像是不该发生的事。这是因为网络接口重启还是什么原因?是什么条件造成的?在

你的问题的简单答案可能是“再次调用listenUDP”,使用'self',但是我很好奇,首先是什么会导致这个错误发生。在

我使用了在Twisted DNS source file上看到的以下技术。它能经受服务器断开连接甚至网络故障。在

from twisted.internet import reactor, protocol, task
import time

class EchoClientDatagramProtocol(protocol.DatagramProtocol):
    def __init__(self, host, port, reactor):
        self.host = host
        self.port = port
        self._reactor = reactor

    def startProtocol(self):
        self.transport.connect(self.host, self.port)

    def stopProtocol(self):
        #on disconnect
        self._reactor.listenUDP(0, self)

    def sendDatagram(self):
        datagram = ntp_packet
        try:
            self.transport.write(datagram, (self.host, self.port))
            print "{:0.6f}".format(time.time())
        except:
            pass

    def datagramReceived(self, datagram, host):
        pass
        #print 'Datagram received: ', repr(datagram)
        #self.sendDatagram()

def main():
    protocol = EchoClientDatagramProtocol('127.0.0.1', 8000, reactor)
    t = reactor.listenUDP(0, protocol)
    l = task.LoopingCall(protocol.sendDatagram)
    l.start(1.0) # call every second
    reactor.run()

if __name__ == '__main__':
    main()

相关问题 更多 >