鉴于我已经使用DatagramProtocol在Twisted中实现了UDP客户端,并使用它与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()
答案 0 :(得分:1)
我使用了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()
答案 1 :(得分:0)
有趣。这听起来像不应该发生的事情。这是由于网络接口重启还是什么?什么条件重现这个?
对你的问题的简单回答可能是“再次呼叫listenUDP
,使用'自我'”,但我很好奇是什么原因可能导致此错误发生。