So I can do the following but the onDisconnect and onConnect functions don't receive the broker - odd design decision?<div><br></div><div>Also, there's a comment in PBServerFactory.clientConnectionMade --> "# XXX does this method make any sense?". Weird.<br>
<div><div><br></div><div><div><font class="Apple-style-span" face="'courier new', monospace">class MyServerObject(pb.Root):</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> def __init__(self):</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> pass</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"> def onConnect(self):</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> log.msg("MyServerObject::onConnect")</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> def onDisconnect(self):</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> log.msg("MyServerObject::onDisconnect")</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">class MyServerFactory(pb.PBServerFactory):</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"> def buildProtocol(self, addr):</font></div><div>
<font class="Apple-style-span" face="'courier new', monospace"> s = addr.host + ":" + str(addr.port)</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> log.msg("MyServerFactory::buildProtocol - building protocol for " + s)</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> broker = pb.PBServerFactory.buildProtocol(self, addr)</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> broker.notifyOnDisconnect(self.root.onDisconnect)</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> broker.notifyOnConnect(self.root.onConnect)</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> return broker</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">reactor.listenTCP(9999, MyServerFactory(MyServerObject()))</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">reactor.run()</font></div><div><br><div class="gmail_quote">On Thu, Apr 2, 2009 at 8:02 AM, Mike Stoddart <span dir="ltr"><<a href="mailto:stodge@gmail.com">stodge@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">I'm experimenting with Twisted Spread for a registry server, among other things. I'm just curious how the onDisconnect function knows which client disconnected? I'm also curious why the PBServerFactory class doesn't have a disconnection function to complement clientConnectionMade? I don't need security - this is running on a closed, secure LAN and I don't need "Avatars". Any suggestions on how to improve this?<div>
<br><div><br></div><div><div><font face="'courier new', monospace">from twisted.internet import protocol, reactor</font></div><div><font face="'courier new', monospace">from twisted.python import log</font></div>
<div><font face="'courier new', monospace">from twisted.spread import pb</font></div><div><font face="'courier new', monospace">import sys</font></div><div>
<font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">log.startLogging(sys.stdout)</font></div><div><font face="'courier new', monospace"><br>
</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">class RegistryService(pb.Root):</font></div>
<div><font face="'courier new', monospace"> def __init__(self):</font></div><div><font face="'courier new', monospace"> self._clientCount = 0</font></div>
<div><font face="'courier new', monospace"> self._clients = {}</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace"> def remote_register(self, name, service):</font></div>
<div><font face="'courier new', monospace"> log.msg("Registering service " + name)</font></div><div><font face="'courier new', monospace"> log.msg(str(service))</font></div>
<div><font face="'courier new', monospace"> </font></div><div><font face="'courier new', monospace"> # Welcome the client.</font></div><div><font face="'courier new', monospace"> service.callRemote("welcome")</font></div>
<div><font face="'courier new', monospace"> </font></div><div><font face="'courier new', monospace"> def onDisconnect(self):</font></div><div><font face="'courier new', monospace"> log.msg("onDisconnect")</font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace"> log.msg("Client count = " + str(len(self._clients)))</font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace"> def onConnect(self, broker): </font></div>
<div><font face="'courier new', monospace"> s = broker.transport.getPeer().host + ":" + str(broker.transport.getPeer().port)</font></div><div><font face="'courier new', monospace"> log.msg("onConnect - client at " + s) </font></div>
<div><font face="'courier new', monospace"> </font></div><div><font face="'courier new', monospace"> # Add the client.</font></div><div><font face="'courier new', monospace"> self._clients[s] = broker.transport</font></div>
<div><font face="'courier new', monospace"> log.msg("Client count = " + str(len(self._clients)))</font></div><div><font face="'courier new', monospace"> </font></div>
<div><font face="'courier new', monospace"> # Set a callback in case they disconnect.</font></div><div><font face="'courier new', monospace"> broker.notifyOnDisconnect(self.onDisconnect)</font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">class MyPBFactory(pb.PBServerFactory):</font></div><div>
<font face="'courier new', monospace"> def __init__(self, root):</font></div><div><font face="'courier new', monospace"> pb.PBServerFactory.__init__(self, root)</font></div>
<div><font face="'courier new', monospace"> </font></div><div><font face="'courier new', monospace"> def clientConnectionMade(self, broker):</font></div>
<div><font face="'courier new', monospace"> log.msg("clientConnectionMade")</font></div><div><font face="'courier new', monospace"> self.root.onConnect(broker) </font></div>
<div><font face="'courier new', monospace"> </font></div><div><font face="'courier new', monospace">registry = RegistryService()</font></div><div><font face="'courier new', monospace">f = MyPBFactory(RegistryService())</font></div>
<div><font face="'courier new', monospace">reactor.listenTCP(9999, f)</font></div><div><font face="'courier new', monospace">reactor.run()</font></div><div>
<br></div><div><br></div><div>Thanks</div><div>Mike</div></div></div>
</blockquote></div><br></div></div></div></div>