[Twisted-Python] Automatic reconnection

Hi all, I need a tcp.Client that can automatically reconnect when disconnected. I've written the following class, and it seems to work, but... * It doesn't handle unix sockets (that's ok for me, I'm using Windows, so I never had them in the first place) * I'm not sure what the "connector" is, and thus I suspect it won't for Clients that use it. * It's only lightly tested Is there a better way to do this (i.e. is there a way to do this already in Twisted, and I just haven't found it yet)? Otherwise, I'd be interested in knowing if anyone else would find this useful, or if maybe it should be included in Twisted. I suspect I'm not the only person who wants to be able to write a server which automatically tries to recover from "upstream" problems. -Andrew. Code: class ReconnectingClient(tcp.Client): """A tcp.Client that automatically reconnects when disconnected Overrideable attributes: * reconnectionDelay -- number of seconds to wait before reconnecting * maxReconnects -- maximum number of reconnects before giving up. The reconnection counter is reset after a successfull reconnection. Set this to None to keep retrying indefinitely. The protocol will have connectionLost called as normal when disconnected, but may get reconnected after that -- so if you need to reset anything in your protocol after a disconnection, do it in Protocol.connectionLost. """ reconnectionDelay = 3.0 maxReconnects = 5 def __init__(self, host, port, protocol, timeout=None, connector=None): tcp.Client.__init__(self, host, port, protocol, timeout, connector) self.reconnectAttempts = 0 self.reconnectProtocol = protocol def connectionLost(self): # Disconnect as normal tcp.Client.connectionLost(self) # Then schedule a reconnect if main.running: # FIXME: Is this test necessary? print 'Lost connection, reconnecting...' main.addTimeout(self.reconnect, self.reconnectionDelay) def reconnect(self): if not self.connected: if (self.maxReconnects is None or self.reconnectAttempts < self.maxReconnects): self.reconnectAttempts += 1 tcp.Connection.__init__(self, self.createInternetSocket(), self.reconnectProtocol) self.doConnect() main.addTimeout(self.reconnect, self.reconnectionDelay) else: print 'Reconnection failed after %d attempts. Giving up.' \ % (self.reconnectAttempts,) else: # Reset the reconnect counter if we're connected. self.reconnectAttempts = 0

Andrew Bennetts wrote:
I need a tcp.Client that can automatically reconnect when disconnected.
tcp.Connector, or app.connectTCP. e.g., given MyProtocol and Application instance app: ====================== from twisted.protocols import protocol # make protocol factory for MyProtocol f = protocol.ClientFactory() f.protocol = MyProtocol app.connectTCP("www.yahoo.com", 80, f)

Andrew Bennetts wrote:
I need a tcp.Client that can automatically reconnect when disconnected.
tcp.Connector, or app.connectTCP. e.g., given MyProtocol and Application instance app: ====================== from twisted.protocols import protocol # make protocol factory for MyProtocol f = protocol.ClientFactory() f.protocol = MyProtocol app.connectTCP("www.yahoo.com", 80, f)
participants (2)
-
Andrew Bennetts
-
Itamar Shtull-Trauring