[Twisted-Python] How can I send unique configuration data for multiple connections through a factory?

Mark Bailey mebly5343 at gmail.com
Wed Feb 10 16:15:40 EST 2010


Thanks, Arjan.  Of course, factories are breeding like rabbits, but that was
the obvious solution!  :-)  I wish I had thought of it.

You saved me several MORE hours...I've spend all day on this.

(It's snowing and work was CLOSED!  Yeehah!)

Mark

On Wed, Feb 10, 2010 at 2:38 PM, Arjan Scherpenisse
<arjan at scherpenisse.net>wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> If you create two instances of your ClusterClientFactory, each with a
> unique string, you should be fine. Requires only a small modification:
>
>         factory = ClusterClientFactory()
>         factory.maxDelay = 120  #  two minutes
>         factory.connectString = "FirstString..."
>         reactor.connectTCP("localhost", 7300, factory)
>
>          factory2 = ClusterClientFactory()
>         factory2.maxDelay = 120  #  two minutes
>         factory2.connectString = "SecondString"
>         reactor2.connectTCP("localhost", 7300, factory)
>
> You can clean this up by putting the maxDelay and connectString in the
> constructor of the factory:
>
> reactor2.connectTCP("localhost", 7300, ClusterClientFactory(120, "First"))
> reactor2.connectTCP("localhost", 7300, ClusterClientFactory(120, "Second"))
>
> Arjan
>
> Mark Bailey wrote:
> > Good day:
> >
> > I've been having fun with Twisted.  I have my application running fine,
> > with multiple server and client connections using Telnet.  :-)
> >
> > However, users always want something.  I need to send some unique
> > configuration information to each connection.  The connections are made
> > using connectTCP.  My first attempt assumed that the connection was made
> > when the call to connectTCP was executed.  It didn't work!  :-(
> >
> > -------------------------------
> >
> > from twisted.internet.protocol import ClientFactory
> > from twisted.internet import reactor
> > from twisted.conch.telnet import StatefulTelnetProtocol
> >
> > class testClient(StatefulTelnetProtocol):
> >
> >     def connectionMade(self):
> >         self.title = self.factory.connectString
> >         print "Client Connected: " + self.title
> >         self.setRawMode()
> >         self.factory.connections.append(self)
> >
> >     def connectionLost(self, reason):
> >         if self in self.factory.connections:
> >             self.factory.connections.remove(self)
> >
> >     def rawDataReceived(self,data):
> >         print data + "\n"
> >
> > class ClusterClientFactory(ClientFactory):
> >
> >     protocol = testClient
> >
> >     def __init__(self):
> >         self.connections = []
> >         self.connectString = ''
> >
> >     def startFactory(self):
> >         print "startFactory: " + self.connectString
> >
> >     def startedConnecting(self, connector):
> >         print "Started connecting: " + str(connector)
> >         print self.connectString
> >
> >     def buildProtocol(self, addr):
> >         print "bulldProtocol: " + str(addr)
> >         print "buildProtocol: " + self.connectString
> >
> >         p = self.protocol()
> >         p.factory = self
> >         return p
> >
> > if __name__ == '__main__':
> >
> >
> >     def startUp():
> >
> >         factory = ClusterClientFactory()
> >         factory.maxDelay = 120  #  two minutes
> >
> >         factory.connectString = "FirstString..."
> >         reactor.connectTCP("localhost", 7300, factory)
> >
> >         factory.connectString = "SecondString"
> >         reactor.connectTCP("localhost", 7300, factory)
> >
> >     reactor.callWhenRunning(startUp)
> >     reactor.run()
> >
> > ----------------------------------
> >
> > The results are that buildProtocol gets the second string both times.
> > startedConnecting gets the correct string, but all I have there is a
> > connection object.  I need the correct data in buildProtocol to do it
> > this way.
> >
> > ------------------------------------
> >
> > C:\Users\Mark\src\play>python testclient.py
> > startFactory: FirstString...
> > Started connecting: <twisted.internet.tcp.Connector instance at
> 0x01DAB620>
> > FirstString...
> > Started connecting: <twisted.internet.tcp.Connector instance at
> 0x01E0EFD0>
> > SecondString
> > bulldProtocol: IPv4Address(TCP, '127.0.0.1', 7300)
> > buildProtocol: SecondString
> > Client Connected: SecondString
> > Welcome to SimpleServer5
> >
> >
> >
> > bulldProtocol: IPv4Address(TCP, '127.0.0.1', 7300)
> > buildProtocol: SecondString
> > Client Connected: SecondString
> > Welcome to SimpleServer5
> >
> > --------------------------
> >
> >
> > My "best" idea is to pass the strings to the factory in a dictionary
> > indexed by the IP address and the port.  Then, buildProtocol() can use
> > that to recover the string and I can use reactor.resolve() to translate
> > the host name to the IP address.  The real application won't have
> > multiple connections to the same host and port like this example, so
> > this would work.
> >
> > There MUST be a better way.  :-)
> >
> > My "simpleserver" is below if you want to run this.
> >
> > THANKS for all of your help.  I have the basic application running now
> > (including a Tkinter GUI  :-) ) and Twisted has saved me hundreds or
> > even thousands of lines of code...
> >
> > Mark Bailey
> >
> > ------------------------------
> >
> > from twisted.conch.telnet import StatefulTelnetProtocol
> > from twisted.internet import reactor, protocol
> > from twisted.protocols.basic import LineReceiver
> >
> > class TelnetEcho(StatefulTelnetProtocol):
> >     def connectionMade(self):
> >         self.factory.connection.append(self)
> >         self.sendLine("Welcome to SimpleServer5\r\n")
> >
> >
> >     def lineReceived(self, data):
> >         data = data.rstrip('\n\r')
> >
> >         if data.upper() == 'BYE':
> >             self.sendLine("Goodbye...\r")
> >             self.transport.loseConnection()
> >         else:
> >             self.sendLine("Unrecognized command: %r\r" % (data,))
> >
> >     def connectionLost(self, reason):
> >         self.factory.connection.remove(self)
> >
> >
> > class TelnetEchoFactory(protocol.Factory):
> >     protocol = TelnetEcho
> >     def __init__(self):
> >         self.connection = []
> >
> >
> > def createTelnetServer(port=7300):
> >     telnetinstance = TelnetEchoFactory()       #  needs to be a list
> >     reactor.listenTCP(port,telnetinstance)
> >
> > if __name__ == "__main__":
> >     reactor.callWhenRunning(createTelnetServer)
> >     reactor.run()
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Twisted-Python mailing list
> > Twisted-Python at twistedmatrix.com
> > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
>
> iEYEARECAAYFAktzC0MACgkQigE4AbflYer9nwCgixra0FaTD6ubvGJufjApRG/m
> A34An3C2ng+4x3/halWSgGQUvQvsCiTM
> =Cg6W
> -----END PGP SIGNATURE-----
>
> _______________________________________________
> 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: http://twistedmatrix.com/pipermail/twisted-python/attachments/20100210/99001b18/attachment.htm 


More information about the Twisted-Python mailing list