[Twisted-Python] Question about writing a server that accepts multiple clients with independent processing
Gabriel Rossetti
mailing_lists at evotex.ch
Thu Feb 21 07:06:43 MST 2008
Phil Mayers wrote:
>
>> Thank you Stephan, ok, but is an instance of a protocol created for
>> every connection? I tried to add data received by the protocol to a
>
> For TCP connections, assuming everything is coded correctly, yes.
>
>> list, and if I get multiple connections that list is filled with all
>> the connection's data, like if only one instance existed.
>
> You didn't by any chance use a class variable did you e.g.:
>
> class foo(...):
> my_data = []
> def dataReceived(self, data):
> self.my_data.append(data)
>
Yes, that must be it :
class XmlStreamTestSrv(xmlstream.XmlStream):
def __init__(self):
xmlstream.XmlStream.__init__(self)
self.message = []
...
even though I though that in python if you put a "self." in front it was
an instance variable and not a class variable. I have been also having
some strange problems, like if I overload
def connectionMade(self):
it never gets called, even though the parent class (XmlStream) also has
it, and also I can't call self.transport.getPeer() or
xmlstream.XmlStream.transport.getPeer(), I get :
print 'Connection from %s!' %
str(xmlstream.XmlStream.transport.getPeer())
exceptions.AttributeError: 'NoneType' object has no attribute 'getPeer'
so maybe something is wrong somewhere.
> ...is wrong. "my_data" is shared by all instances of the class and is
> mutable. You'll need to create instance variables, usually (I believe)
> as part of the factory process.
Ok, I'll look into that, thanks.
>
> If you can write a minimal example showing the problem, someone can
> probably tell you what you're doing wrong.
>
Ok, thanks, here's a minimal example :
from twisted.words.xish import xmlstream, domish
from twisted.internet import reactor, protocol
from twisted.internet.protocol import Protocol, Factory
from twisted.words.xish import xpath
class XmlStreamTestSrv(xmlstream.XmlStream):
def __init__(self):
xmlstream.XmlStream.__init__(self)
self.message = []
def connectionMade(self): # never called, why?
print 'Connected :' #, string(self.transport.getPeer().host)
def _onHeader(self, element):
#print "got header from % : %s" %
(str(self.transport.getPeer().host), element.toXml())
self.message.append(element.toXml())
def _connected(self, xs):
#print 'Connection from %s!' %
str(xmlstream.XmlStream.transport.getPeer().host)
xs.addObserver("/header", self._onHeader)
if __name__ == "__main__":
c = XmlStreamTestSrv()
f = xmlstream.XmlStreamFactory()
#f.addBootstrap(xmlstream.STREAM_CONNECTED_EVENT, c._connected)
f.addBootstrap(xmlstream.STREAM_START_EVENT, c._connected)
reactor.listenTCP(4321, f)
reactor.run()
Regards,
Gabriel Rossetti
More information about the Twisted-Python
mailing list