[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):
self.delegate.connectionMade()
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
self.transport.loseConnection()
def connectionLost(self, reason):
print "connection lost"
from twisted.internet import reactor
#reactor.stop()
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!"
reactor.stop()
def clientConnectionLost(self, connector, reason):
print "Connection lost - goodbye!"
print "numPorts= %d" % self.numPorts
if self.numPorts == 1:
reactor.stop()
# 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)
reactor.run()
# this only runs if the module was *not* imported
if __name__ == '__main__':
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.
Jean-Paul
_______________________________________________
Twisted-Python mailing list
Twisted-Python at twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
---------------------------------
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