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 class="Apple-style-span" face="'courier new', monospace">from twisted.internet import protocol, reactor</font></div><div><font class="Apple-style-span" face="'courier new', monospace">from twisted.python import log</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">from twisted.spread import pb</font></div><div><font class="Apple-style-span" face="'courier new', monospace">import sys</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">log.startLogging(sys.stdout)</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"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">class RegistryService(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"> self._clientCount = 0</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> self._clients = {}</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 remote_register(self, name, service):</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> log.msg("Registering service " + name)</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> log.msg(str(service))</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> </font></div><div><font class="Apple-style-span" face="'courier new', monospace"> # Welcome the client.</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> service.callRemote("welcome")</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> </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("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"> log.msg("Client count = " + str(len(self._clients)))</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, broker): </font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> s = broker.transport.getPeer().host + ":" + str(broker.transport.getPeer().port)</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> log.msg("onConnect - client at " + s) </font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> </font></div><div><font class="Apple-style-span" face="'courier new', monospace"> # Add the client.</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> self._clients[s] = broker.transport</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> log.msg("Client count = " + str(len(self._clients)))</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> </font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> # Set a callback in case they disconnect.</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> broker.notifyOnDisconnect(self.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 MyPBFactory(pb.PBServerFactory):</font></div><div>
<font class="Apple-style-span" face="'courier new', monospace"> def __init__(self, root):</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> pb.PBServerFactory.__init__(self, root)</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> </font></div><div><font class="Apple-style-span" face="'courier new', monospace"> def clientConnectionMade(self, broker):</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> log.msg("clientConnectionMade")</font></div><div><font class="Apple-style-span" face="'courier new', monospace"> self.root.onConnect(broker) </font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"> </font></div><div><font class="Apple-style-span" face="'courier new', monospace">registry = RegistryService()</font></div><div><font class="Apple-style-span" face="'courier new', monospace">f = MyPBFactory(RegistryService())</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">reactor.listenTCP(9999, f)</font></div><div><font class="Apple-style-span" face="'courier new', monospace">reactor.run()</font></div><div>
<br></div><div><br></div><div>Thanks</div><div>Mike</div></div></div>