Socketverbindung gzip-komprimiert

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Daishy
User
Beiträge: 21
Registriert: Samstag 4. April 2009, 12:40
Kontaktdaten:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Es gibt in Python auch ein ``gzip``-Modul. ``gzip`` ist nämlich nicht ganz das gleiche wie ``zlib``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Daishy
User
Beiträge: 21
Registriert: Samstag 4. April 2009, 12:40
Kontaktdaten:

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 :?
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

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!
LG Maik
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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`.
Daishy
User
Beiträge: 21
Registriert: Samstag 4. April 2009, 12:40
Kontaktdaten:

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 :)
Antworten