I&#39;m experimenting with Twisted Spread for a registry server, among other things. I&#39;m just curious how the onDisconnect function knows which client disconnected? I&#39;m also curious why the PBServerFactory class doesn&#39;t have a disconnection function to complement clientConnectionMade? I don&#39;t need security - this is running on a closed, secure LAN and I don&#39;t need &quot;Avatars&quot;. Any suggestions on how to improve this?<div>
<br><div><br></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">from twisted.internet import protocol, reactor</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">from twisted.python import log</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">from twisted.spread import pb</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import sys</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">log.startLogging(sys.stdout)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">class RegistryService(pb.Root):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    def __init__(self):</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        self._clientCount = 0</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        self._clients = {}</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    def remote_register(self, name, service):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        log.msg(&quot;Registering service &quot; + name)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        log.msg(str(service))</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        # Welcome the client.</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        service.callRemote(&quot;welcome&quot;)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    def onDisconnect(self):</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        log.msg(&quot;onDisconnect&quot;)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        log.msg(&quot;Client count = &quot; + str(len(self._clients)))</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    def onConnect(self, broker):       </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        s = broker.transport.getPeer().host + &quot;:&quot; + str(broker.transport.getPeer().port)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        log.msg(&quot;onConnect - client at &quot; + s) </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        # Add the client.</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        self._clients[s] = broker.transport</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        log.msg(&quot;Client count = &quot; + str(len(self._clients)))</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        # Set a callback in case they disconnect.</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        broker.notifyOnDisconnect(self.onDisconnect)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">class MyPBFactory(pb.PBServerFactory):</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    def __init__(self, root):</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        pb.PBServerFactory.__init__(self, root)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">               </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    def clientConnectionMade(self, broker):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        log.msg(&quot;clientConnectionMade&quot;)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        self.root.onConnect(broker)      </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">registry = RegistryService()</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">f = MyPBFactory(RegistryService())</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">reactor.listenTCP(9999, f)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">reactor.run()</font></div><div>
<br></div><div><br></div><div>Thanks</div><div>Mike</div></div></div>