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..
Keyserver - Dateienaustausch und Abruf
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`.
Der Möglichkeiten hast Du mit Twisted mehrere: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?!
- oder etwas höher angesetzt mittels XML-RPC Server und Client
- oder ganz oben mit Perspective Broker
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
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
gruss
- 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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
oh, sehr cool... das benutz ich lieber als das xmlrpcserver.py.
danke
danke
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?
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?
das ist imho eine Fehleinschätzung.dankegut hat geschrieben:also ich denke, von twisted werde ich aufgrund der komplexität erstmal absehen.
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()
Ciao,
dev
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.
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi dankegut!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?!
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
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
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: 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.
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.dankegut hat geschrieben:Hast du da vielleicht schon was fertiges, also einen einfachen RequestHandler, bis jetzt hab ich das mit SimpleXMLRPCServer gut hinbekommen.
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()
Ciao,
dev
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.Was Fertiges? Ich will doch nicht Deine Applikation schreiben. Wink
Denn viel mehr braucht es aber auch nicht:
Danke trotzdem für dein Codeschnipsel... so bekomm ich einen guten Eindruck von beiden Varianten.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Christian!dankegut hat geschrieben:gibt es irgendwo was gut dokumentiertes über den SimpleXMLRPCServer, gerade was den RequestHandler/Dispatcher angeht?!
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
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
hm, mein fehler. ich hatte da was mit den threads auskommentiert
da ging dann gar nix mehr ich habs jetzt einfach mal so gemacht:
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
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()
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.
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 , 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.
(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 , 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.
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Masaru!Masaru hat geschrieben:XML-RPC "sollte" nie dazu dienen, ganze Dateninhalte zwischen zwei Punkten zu verschieben (Dateitransfer).
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.