[Twisted-Python] client connecting to 2 servers (non simultaneously)
Kevin Horn
kevin.horn at gmail.com
Tue Jan 11 11:36:59 MST 2011
Using a deque for this is a fantastic idea, though I would have used
rotate(-1), as your example looks like it rotate's "backwards" to me.
Matter of taste I suppose. It doesn't make much actual difference.
Kevin Horn
On Tue, Jan 11, 2011 at 7:11 AM, Jason Rennie <jrennie at gmail.com> wrote:
> 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/
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20110111/85690bcd/attachment.html>
More information about the Twisted-Python
mailing list