[Twisted-Python] client connecting to 2 servers (non simultaneously)

Jason Rennie jrennie at gmail.com
Tue Jan 11 08:11:26 EST 2011


You could probably generalize and simplify by using a collections.deque of
hosts/ports and using the rotate() method before each reactor.connectTCP.
 Also, no need for multiple reactor imports---one at the top of the code is
fine.  Note that if the connection is "lost" in a non-clean fashion, you may
also want to reconnect.  IIUC, "fail" only handles the case that no
connection is made (protocol is never created).

import collections
from twisted.internet import reactor

class MyClientFactory(object):
    protocol = MyClientProtocol
    def __init__(self, hosts):
        self.hosts = collections.deque(hosts)
        reactor.callWhenRunning(reactor.connectTCP, self.hosts[0][0],
self.hosts[0][1], self)
        self.hosts.rotate(1)
    def clientConnectionFailed(self, connector, reason):
        reactor.callLater(2.0, connectTCP, self.hosts[0][0],
self.hosts[0][1], self)
        self.hosts.rotate(1)

factory = MyClientFactory([('host1', port1), ('host2', port2), ...])
reactor.run()

Cheers,

Jason

On Tue, Jan 11, 2011 at 5:17 AM, <benjamin.bertrand at lfv.se> wrote:

> Hi,
>
> I'm new to twisted and I have started to write a new protocol with a TCP
> client and server.
> In my protocol, a client should be able to connect to 2 servers
> (master/slave node - only the master accepts connection).
> The client should try to connect to server1. If it fails, try to connect
> to server2 (after a specific timeout). If that fails, try server1...
> I came up with a solution (see below).
> As I'm new to twisted and I haven't seen anything like that in the
> examples, I'd like to check if that's a proper way to do it.
> Any comments is welcome.
>
> Thanks
>
> Benjamin
>
> ***********************************************
> class MyClientFactory(ClientFactory):
>
>    protocol = MyClientProtocol
>
>    def __init__(self, host2=None):
>        self.host1 = None
>        self.host2 = host2
>
>    def clientConnectionFailed(self, connector, reason):
>        from twisted.internet import reactor
>        if self.host2 is None:
>            # host2 is not defined, reconnect to host1
>            reactor.callLater(2.0, connector.connect)
>        else:
>            destination = connector.getDestination()
>            if self.host1 is None:
>                # First connection failed, initialize host1, and try
> host2
>                self.host1 = destination.host
>                host = self.host2
>            elif destination.host == self.host1:
>                # Connection to host1 failed, try host2
>                host = self.host2
>            else:
>                # Connection to host2 failed, try host1
>                host = self.host1
>            reactor.callLater(2.0, reactor.connectTCP, host,
> destination.port, self)
>
>
> factory = MyClientFactory(server2)
> from twisted.internet import reactor
> reactor.connectTCP(server1, 8010, factory)
> reactor.run()
> ***********************************************
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>



-- 
Jason Rennie
Research Scientist, ITA Software
617-714-2645
http://www.itasoftware.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://twistedmatrix.com/pipermail/twisted-python/attachments/20110111/8cb6c39e/attachment.htm 


More information about the Twisted-Python mailing list