Seite 1 von 1

Socketverbindung gzip-komprimiert

Verfasst: Donnerstag 17. Februar 2011, 20:44
von Daishy
Hi zusammen,

Ich stehe gerade vor einem Problem zu dem ich bis jetzt vergeblich eine Loesung gesucht habe. Ich habe ein Java-Programm das als Server fungiert. Dort werden Anfragen angekommen, bearbeitet und wieder zurueckgeliefert. Bis jetzt lief das ganze ohne Kompression und damit funktioniert es auch (unten der Javacode fuer das lesen auf dem Server und der Python-Code)

Code: Alles auswählen

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String input = in.readLine();
socket.shutdownInput();

Code: Alles auswählen

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.send(request)
Jetzt kommt aber auf Serverseite eine Kompression dazu, die dort folgendermassen realisiert wird (Java):

Code: Alles auswählen

GZIPInputStream in = new GZIPInputStream(socket.getInputStream());
int c;
StringBuffer res = new StringBuffer();
while((c = in.read()) != -1) res.append((char)c);
socket.shutdownInput();
return res.toString();
Natuerlich funktioniert der obige Python-code so nicht mehr, aber ich finde nicht raus, wie ich die Verbindung von Python aus ebenfalls komprimieren kann. Ich habe schon mit zlib.compress/decompress herumprobiert, aber dann scheint zwar der Text komprimiert zu sein, Java meckert aber weil der Input kein GZIP-Stream ist. Gibt es in Python da ne Moeglichkeit?

Im Voraus schonmal vielen Dank fuer die Hilfe


Gruesse,
Daishy

Re: Socketverbindung gzip-komprimiert

Verfasst: Donnerstag 17. Februar 2011, 21:21
von Leonidas
Es gibt in Python auch ein ``gzip``-Modul. ``gzip`` ist nämlich nicht ganz das gleiche wie ``zlib``.

Re: Socketverbindung gzip-komprimiert

Verfasst: Donnerstag 17. Februar 2011, 21:28
von Daishy
Ich habe http://docs.python.org/library/gzip.html#gzip das gefunden, aber mit dem kriege ich nur Dateien geoeffnet, oder uebersehe ich was? Mein Problem ist, dass das send schon abbbricht (bzw. der Server im read), weil der Stream kein GZip ist. Meine erste Vermutung war, dass ich request einfach mit einer gzip-Library in eine Byte-Folge umwandeln kann, aber dazu habe ich nichts gefunden :?

Re: Socketverbindung gzip-komprimiert

Verfasst: Freitag 18. Februar 2011, 14:00
von daemonTutorials
gzip ist schon richtig! Du musst nur den String einzippen und versenden, hauptsache dein Java-Code verwendet die gleiche Komprimierung!

Oder schreibe einfach die Bytes von Python in eine Datei, meinetwegen *.txt und öffne sie anschließend mit Java wieder! Oder du öffnest die Datei vorher nochmal in Python und schickst den Inhalt per "socket.send()" weiter.
Das wäre die einfachste Lösung.
Python: String in Bytes verwandeln, Daten einzippen, Daten holen, Daten senden
Java: Daten empfangen(, Daten in Datei schreiben, Daten auspacken, Daten auslesen), Daten auspacken, Daten weiterverarbeiten

Nicht schwer!

Re: Socketverbindung gzip-komprimiert

Verfasst: Freitag 18. Februar 2011, 14:53
von cofi
daemonTutorials hat geschrieben:gzip ist schon richtig! Du musst nur den String einzippen und versenden, hauptsache dein Java-Code verwendet die gleiche Komprimierung!
Ja. Denn das gzip-Modul bietet das ja an :roll:
Und eine Datei kann kann aus vielen Gruenden direkt rausfliegen.

Ich werf mal das StringIO-Modul in die Runde, in Verbindung mit `gzip.GzipFile`s `fileobj`.

Re: Socketverbindung gzip-komprimiert

Verfasst: Freitag 18. Februar 2011, 17:16
von Daishy
Ja, direkt einen string umwandeln habe ich auch ncihts zu gefunden und der umweg ueber eine datei waere moeglich, aber etwas aufwendiger. Ich werde mir mal stringio naeher anschauen, danke :)