[Python-de] RPC-Server

Diez B. Roggisch deets at web.de
Mon Nov 1 12:45:17 CET 2004


> Und jetzt die Frage: wie muss ich correct den
> Klientserver beenden, damit er noch mal am dasselben
> Port starten könnte?

Was eventuell hilft ist ein os.waitpid mit der sub-server pid - dann erst wird 
der Prozess wirklich beendet. Zumindest koennte das helfen. Aber es koennte 
trotzdem sein, das das System den Port noch etwas blockiert - da hatte ich 
manchmal auch probleme.

Insgesamt wuerde ich aber eher sagen, das dein ganzer Anzatz nicht gut ist. 
Denn was machst du denn, wenn ein 2ter Client eine Anfrage stellt, aber der 
Backupserver noch laeuft? Dann krachts auch. Und Ports hoczuzaehlen oder so 
hilft ouch nicht. Ausserdem ist der Ansatz unnoetig kompliziert, ueber 
skripte Prozesse zu starten - stattdessen lieber fork verwenden. Aber auch 
das ist nicht noetig.

Besser ist es, nur einen Server zu verwenden, der eine authenticate-methode 
hat. Da meldet sich der client an. Wenn das geklappt hat, wird fuer die 
Verbindung ein Sessionkey erzeugt, der an den Client zurueckgeht. Unter 
diesem Key werden dann die client-daten im Server gespeichert. Und alle 
Methoden, die dein jetziger Client-Server hat, bekommen als erstes Argument 
eben dies Key.

Das sieht ungefaehr so aus (ungetestet und aussem Kopp:)


class Server(XMLRPCServer):
    def __init__(self):
          XMLRPCServer.__init__(self)
         self.client_data = {}
         self.key = 0

   def authenticate(self, credentials):
         if authenticated(credentials):
             key = self.next_key()
             self.client_data[key] = ClientData()

    def work(self, client_key, args):
        data = self.client_data[key]
        return self.work_with_data(data)

MfG Diez