Keyserver - Dateienaustausch und Abruf

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

Hallo erstmal,

ich bin neu hier :) Ich habe z.Zt ein Projekt, in dem ich eine Art low-level Keyserver programmieren muss. Ich hab jetzt schon mit sockets rumprogrammiert und hab mich jetzt auch kurz mit twisted beschäftigt. Nur weiss ich jetzt nicht, was bei meinem Einsatz besser ist.
Also, es sollen XML-Daten von einem Client zu dem Server geschickt werden, da stellt sich mein erstes Problem, wie ich dies ein - auslese?! auf netzwerkebene. Die Daten sollen dann später im Keyserver zusammengefügt werden.. aber das erstmal später. Mir geht es momentan im "reinen" Datenaustausch. Sprich, eine Datei vom Client schicken und die beim Server abspeichern. Kann mir da jemand weiterhelfen, wie da anfange?!

Vielen Dank schonmal..
BlackJack

Hm, von Sockets würde ich Abstand nehmen soweit das möglich ist. Schau Dir mal XML-RPC an. Ein Modul dafür ist in der Standardbibliothek enthalten und heisst `xmlrpclib`.
dev
User
Beiträge: 49
Registriert: Montag 23. Januar 2006, 09:52
Kontaktdaten:

dankegut hat geschrieben:Ich hab jetzt schon mit sockets rumprogrammiert und hab mich jetzt auch kurz mit twisted beschäftigt.
[...]
Also, es sollen XML-Daten von einem Client zu dem Server geschickt werden, da stellt sich mein erstes Problem, wie ich dies ein - auslese?!
Der Möglichkeiten hast Du mit Twisted mehrere:
Der Aussage von "Sockets Abstand nehmen" kann ich so pauschal nicht zustimmen, es ist halt die Basis aller Dinge und die Möglichkeit etwas ohne zusätzlichen Protokoll-Overhead zu transportieren.

Letztendlich ist es eine Frage der Bequemlichkeit und/oder der Eleganz.

Mit Sockets/LineReceiver hast Du zwei parsing Aufgaben - a) Anfang und Ende Deines zu übertragenden XML-Strings zu erkennen und b) diesen dann zu interpretieren.
Auf der XML-RPC Ebene packst Du Dein XML in einen String und mußt Dich nur noch um dessen Interpretation kümmern. Das "Object-Handling" übernimmt hier schon die XML-RPC Ebene.

Oder Du verschiebst gleich ein dict, z.B. als XML-RPC struct oder als object über PB.

Ciao,
dev
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

danke erstmal für die antworten. also ich denke, von twisted werde ich aufgrund der komplexität erstmal absehen. Ich versuch es jetzt mit SocketServer und derm xmlrpcserver von Frederik Lundh. Das funktioniert schon recht gut. Falls noch jemand Ideen oder Anregungen hat, was man noch verwenden könnte, dem bin ich dankbar :)

gruss
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

oh, sehr cool... das benutz ich lieber als das xmlrpcserver.py.

danke :)
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

so, ich bins nochmal.

Wie sieht das denn bei dem SimpleXMLRPCServer mit Threading aus. Ich muss davon ausgehen, dass ca. 20 - 30 Clients mit dem Server verbunden sind und ständig, Keys senden oder abfragen?! Muss ich das noch extra einbinden?
dev
User
Beiträge: 49
Registriert: Montag 23. Januar 2006, 09:52
Kontaktdaten:

dankegut hat geschrieben:also ich denke, von twisted werde ich aufgrund der komplexität erstmal absehen.
das ist imho eine Fehleinschätzung. :wink:

Code: Alles auswählen

from twisted.web import server,xmlrpc
from twisted.internet import reactor

class XMLRPC(xmlrpc.XMLRPC):

    def xmlrpc_ping(self):
        print "ping"
        return "Ok"
        
reactor.listenTCP(12345, server.Site(XMLRPC()))            
reactor.run()
Das wäre der Server-Teil.

Ciao,
dev
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

okay okay :) das ist bei den meisten recht einfach, aber laut diesem hier

http://twistedmatrix.com/documents/curr ... mlrpc.html

ist die API Semi-stable und die Handler sind nicht gut oder wenn überhaupt nicht dokumentiert, das ist schon fast n Grund, dass nicht zu benutzen.
Hast du da vielleicht schon was fertiges, also einen einfachen RequestHandler, bis jetzt hab ich das mit SimpleXMLRPCServer gut hinbekommen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dankegut hat geschrieben:Wie sieht das denn bei dem SimpleXMLRPCServer mit Threading aus. Ich muss davon ausgehen, dass ca. 20 - 30 Clients mit dem Server verbunden sind und ständig, Keys senden oder abfragen?!
Hi dankegut!

20-30 gleichzeitig verbundene Clients schafft der ``SimpleXMLRPCServer`` so nicht ohne weiteres.
Wenn man aber den ``ThreadingTCPServer`` als Basis verwendet, dann ist das kein Problem mehr.

Siehe Einfacher Threading XML-RPC Server und Client.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

wow, danke :) Damit hätt ich jetzt nicht gerechnet.... :)

Darauf kann ich jedenfalls erstmal gut aufbauen, falls ich ans nächste Problem stoße, meld ich mich mal wieder.

Ahja... gibt es irgendwo was gut dokumentiertes über den SimpleXMLRPCServer, gerade was den RequestHandler/Dispatcher angeht?!

Ist mein erstes Projekt in Python, zwar etwas groß dimensioniert, aber wir sind 4 Leute mit versch. Teilaufgaben und ich sozusagen der einzige "neue"

Danke vielmals

Gruss
Christian
dev
User
Beiträge: 49
Registriert: Montag 23. Januar 2006, 09:52
Kontaktdaten:

dankegut hat geschrieben: ist die API Semi-stable und die Handler sind nicht gut oder wenn überhaupt nicht dokumentiert, das ist schon fast n Grund, dass nicht zu benutzen.
das ist sicherlich ein Thema und immer wieder Gegenstand von Diskussionen auf der twisted ml, irgendwo halt auch ein Henne/Ei Problem, bei mehr Nutzern wird die Dokumentation besser, interessierte Nutzer werden aber von der u.U. nicht Ihren Vorstellungen entsprechenden Dokumentation abgeschreckt.
dankegut hat geschrieben:Hast du da vielleicht schon was fertiges, also einen einfachen RequestHandler, bis jetzt hab ich das mit SimpleXMLRPCServer gut hinbekommen.
Ich will Dich in keinster Weise von der Sache mit dem SimpleXMLRPCServer abbringen oder diesen abwerten. Ich fand nur das Ergebnis Deiner Überlegungen Dein Problem mit twisted zu lösen schade und kommentierungswürdig, auch wenn es natürlich seine Gründe in den oben angeführten hat.

Was Fertiges? Ich will doch nicht Deine Applikation schreiben. ;-)
Denn viel mehr braucht es aber auch nicht:

Code: Alles auswählen

from twisted.web import server
from twisted.web import xmlrpc
from twisted.internet import reactor

class KeyServer:

   def __init__(self):
       self.keys = {}

   def store( self, key, item):
       self.keys.update({key:item})
       print self.keys

   def retreive( self, key):
       try:
           return self.keys[key]
       except:
           return 'no such item'

    def remove( self, key):
        pass

class XMLRPC(xmlrpc.XMLRPC):

    def __init__(self, keys):
        xmlrpc.XMLRPC.__init__(self)
        self.keys = keys

    def xmlrpc_store(self, key, item):
        self.keys.store(key, item)
        return "Ok"

    def xmlrpc_retreive(self, key):
        return self.keys.retreive(key)

    def xmlrpc_ping(self):
        print "ping"
        return "Ok"
        
if __name__ == '__main__': 
    keys = KeyServer()
    reactor.listenTCP(12345, server.Site(XMLRPC(keys)))            
    reactor.run()
Ob man nur für sowas Twisted verwenden muß, sei mal dahingestellt. Richtig interessant wird es aber, wenn Du keys z.B. noch über SOAP ansprechen willst und über eine html-Seite Dir den aktuellen Inhalt ansehen möchtest, oder ... - wirf vielleicht nochmals einen Blick in das Finger-Tutorial.

Ciao,
dev
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

Was Fertiges? Ich will doch nicht Deine Applikation schreiben. Wink
Denn viel mehr braucht es aber auch nicht:
Um Gottes Willen :) Aber man tut sich leichter, von "einfachen" Beispielen zu lernen, geht mir jedenfalls so. Die auf der Twisted Homepage find ich jetzt nicht so prickelnd, deswegen.

Danke trotzdem für dein Codeschnipsel... so bekomm ich einen guten Eindruck von beiden Varianten.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dankegut hat geschrieben:gibt es irgendwo was gut dokumentiertes über den SimpleXMLRPCServer, gerade was den RequestHandler/Dispatcher angeht?!
Hi Christian!

Nur den Quellcode: ``C:\Python24\Lib\SimpleXMLRPCServer.py``

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

okay, muss mich mal zu wort melden. Ich hab irgendwie n kleinen Denkfehler oder geh von was falschem aus.

Es geht z.B um eine Funktion listKeys(),
eine xml datei öffnen, mittels key = open("test.xml),
diese dann zurückliefern an den client. habs auch mit pickle versucht, aber weiss nicht so genau, ob das der richtige ansatz ist, praktisch das Objekt zu serialisieren. Ich hab irgendwo gelesen, dass man damit "Platz" spart.
Jedenfalls bekomm ich es nicht hin, die Datei auf dem Client zu empfangen. Ich hab erst diverse leichte methoden probiert, wie z.b Zahlen addieren etc. das ging alles wunderbar aber mit den dateien hab ich so mein problem, liegt wohl daran, dass ich noch nicht soviel mit Python gearbeitet habe.

Hat vllt jmd n Vorschlag?? Danke
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

hm, mein fehler. ich hatte da was mit den threads auskommentiert :oops:
da ging dann gar nix mehr :) ich habs jetzt einfach mal so gemacht:

Code: Alles auswählen

def listKeys(self):
        key = open("test.xml")
        return key.read()
nicht schön, aber naja. Kann ich dem Client jetzt sagen, dass er das in eine Datei schreiben soll ?! am besten noch mit dem gleichen dateinamen :roll:
BlackJack

Etwas sauberer wäre es, wenn Du die Datei auch selbst wieder schliesst. Und etwas flexibler wird's wenn Du den Dateinamen nicht hart kodierst sondern als Argument der Funktion übergibst.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Allgemeine Info:
(vielleicht ganz interessant noch zu wissen)

XML-RPC "sollte" nie dazu dienen, ganze Dateninhalte zwischen zwei Punkten zu verschieben (Dateitransfer).

Wie der Name schon sagt, dreht es sich bei XML-RPC um Remote Procedure Calls, die mittels XML-Tags die Methodenaufrufe und Rückgaben verpacken.

RPC dient im allgemeinen dem üblen PC-Treiber dazu, "Funktionsaufrufe" auf entfernten Rechnern durchzuführen.

Funktionsaufrufe liefern zwar Ergebnisse im schlimmsten Falle zurück :wink:, jedoch nicht unbedingt Dateien.

Für einen "Dateitransfer" gibt es andere Protokolle, Spezifikationen, Implementierungen ... und RPC, sowie XML-RPC zählen eher eindeutig nicht dazu.
BlackJack

Naja der OP wollte Schlüssel austauschen, das kann man schon als Argument für einen entfernten Prozeduraufruf verstehen. Das die lokal und beim Empfänger irgendwie gespeichert werden müssen, ändert daran ja nichts.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Masaru hat geschrieben:XML-RPC "sollte" nie dazu dienen, ganze Dateninhalte zwischen zwei Punkten zu verschieben (Dateitransfer).
Hi Masaru!

Warum soll man etwas komplizierteres dafür verwenden? Wenn ein Prozeduraufruf den Inhalt einer Datei zurück gibt, dann gibt er halt den Inhalt einer Datei zurück. Na und?

Nur aus Prinzip, weil es sich ja bei der Rückgabe um den Inhalt einer Datei handelt, halse ich mir nicht unbedingt etwas komplizierteres auf.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten