[Twisted-Python] is it possible to have a (single) twisted client that

john peter neuzhoundxx at yahoo.com
Fri Jan 27 23:16:49 EST 2006

Thank you. I wonder if I could ask a follow-on question.
  Below is a version of echoclient that seems to work.
  I overrode EchoFactory's __init__ method to initialize the client id
  "generator" to zero and the buildProtocol method to create a protocol
  instance and give that instance its own unique id.  I stop the reactor when the last connection "signs off".
  I'm now wondering: what's the best way to enable the protocol instances  to have different behaviors? Here's my current thinking:  Maybe I  can have EchoFactory pass an appropriate "delegate" object to each  protocol instance so that the implementation of methods such as  connectionMade would be something like this:
  def connectionMade(self):
  The approach I was thinking of using to pass this delegate from  EchoFactory to a protocol instance was something "hokey" like if  next_client_id = 1, then pass to the protocol instance the delegate  object associated with a key of 1 in the dictionary { 1:delegate1,  2:delegate2, ...}.  Are there better approaches available? Again,  thanks for any help or advice!
  sample code for a multi-connect client:
  from twisted.internet import reactor, protocol
  # a client protocol
  class EchoClient(protocol.Protocol):
      """Once connected, send a message, then print the result."""
      def __init__(self, id):
          self.id = id
      def connectionMade(self):
          self.transport.write("sender# %d says: hello, world!" % self.id)
      def dataReceived(self, data):
          "As soon as any data is received, write it back."
          print "Server said:", data
      def connectionLost(self, reason):
          print "connection lost"
          from twisted.internet import reactor
  class EchoFactory(protocol.ClientFactory):
      protocol = EchoClient
      def __init__(self):
          self.next_client_id = 0
      def buildProtocol(self, addr):
          print "buildProtocol called"
          self.next_client_id += 1
          p = self.protocol(self.next_client_id)
          p.factory = self
          return p
      def clientConnectionFailed(self, connector, reason):
          print "Connection failed - goodbye!"
      def clientConnectionLost(self, connector, reason):
          print "Connection lost - goodbye!"
          print "numPorts= %d" % self.numPorts
          if self.numPorts == 1:
  # this connects the protocol to a server runing on port 8000
  def main():
      f = EchoFactory()
      reactor.connectTCP("localhost", 8000, f)
      reactor.connectTCP("localhost", 8000, f)
      reactor.connectTCP("localhost", 8000, f)
  # this only runs if the module was *not* imported
  if __name__ == '__main__':

Jean-Paul Calderone <exarkun at divmod.com> wrote:  On Thu, 26 Jan 2006 20:27:34 -0800 (PST), john peter  wrote:
> makes more than one (say, three) connections to the same server instance?
>  i was thinking of something like this: an 'ADD' connection that sends  new data items to the server for saving, an 'UPDATE' connection that  sends data update requests, and a 'DELETE' connection that sends data  deletion requests. All three connections share DATA ID information, but  should otherwise have "independent" existence so that they can be  configured to have different "behavioral" attributes; that is, the ADD  connection saves the data ids for items successfully persisted to an  'in-memory' table for later lookups, and UPDATE and DELETE requests can  only be issued for DATA IDs known to be valid for the "current" session  (thus, the "in-memory" table lookups) and each connection may have  attributes such as "send" rates, etc.
> If this is  possible, could someone please give me some pointers on what twisted  code to study/ look at? thank you very much for your help!

This  is as easy as calling reactor.connectTCP() three times. There's nothing  special about the first call, or the second call, or the third call.  Each one just sets up a connection attempt.

Try taking echoclient.py from the core examples and adding some more connectTCP calls to it, see what happens.


Twisted-Python mailing list
Twisted-Python at twistedmatrix.com

 What are the most popular cars? Find out at Yahoo! Autos 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://twistedmatrix.com/pipermail/twisted-python/attachments/20060127/182254d4/attachment.htm 

More information about the Twisted-Python mailing list