ERLEDIGT
JA
JA
ANTWORTEN
15
15
ZUGRIFFE
3469
3469
EMPFEHLEN
-
22.01.08 17:18 #1
- Registriert seit
- Apr 2007
- Beiträge
- 30
Hi Leute ich habe mal wieder ein Problem bei dem ich einfach nicht weiter komme.
Ich habe einen Socket erstellt und damit einem PHP-Server ein POST gesendet nun empfange ich seine Antwort im gzip Format.
Ich weiss ich könnte ihm das POST auch einfach mit der anfrage deflat schicken und das ganze nicht gepackt empfangen, aber dabei enstehen Fehler im empfangen Content (keine Ahnung warum) nun die Frage wie entpacke ich das ganze?
Code :1 2
InputStream inputStream = socket.getInputStream(); GZIPInputStream GinputStream = new GZIPInputStream(inputStream);
Dies war der erste Schritt den ich gemacht habe den InputStream holen ist ja kein Problem aber wenn ich das in den GZIPInputStream legen will bekomme ich die Exception
java.io.IOException: Not in GZIP format
Wie soll ich das verstehen und entpacken denn das Empfangene is definitiv im GZIP format
-
22.01.08 17:21 #2
- Registriert seit
- Apr 2007
- Beiträge
- 30
sorry für doppelpost aber mein browser wollte nich so wie ich wollte
-
22.01.08 19:57 #3
- Registriert seit
- Apr 2007
- Beiträge
- 30
Jetzt kommt der Hammer wo mein Verständniss komplett aussteigt.
Ich habe den GZIP anteil aus dem Empfangen in einen String geschrieben.
Diesen ganz simpel in eine Datei geschrieben und diese mithilfe von GZIPInputStream wieder eingelesen.
Das klappt tatsächlich aber ist ja nich gerade das Gelbe von Ei also hab ich versucht den String mithilfe von
InputStream istemp = new ByteArrayInputStream(ziptext.getBytes());
in ein InputStream verfrachtet um diesen Stream mit dem GZIPInputStream zu entpacken und da wirft er wieder die Exception
java.io.IOException: Not in GZIP format
Was also tun? Ich kann doch nich jedes mal den Krempel erst in eine Datei schreiben.
-
22.01.08 20:13 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
ein Teil der Response (Header) ist im Klartext... nur der Response Body ist dann im GZip Format:
http://www.http-compression.com/#server_response
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
22.01.08 22:57 #5
- Registriert seit
- Apr 2007
- Beiträge
- 30
Ja das weiss ich ja. Den Header Teil hab ich ja abgeschnitten und als Datei gespeichert damit ich Diese mit GZIP öffnen kann.
Die Frage ist wie kann ich diesen Kompremierten Teil ohne ihn vorher in eine Datei zu schreiben entpacken?
-
ich shcätze, du wirst ihn im Transfer-Encoding = chunked bekommen, d.h. du musst die Chunks erst zusammensetzen (dabei vor allem die chunk-header wegschneiden).
Das rfc sollte helfen:
http://www.w3.org/Protocols/rfc2616/...c3.html#sec3.6
-
25.02.08 17:25 #7
- Registriert seit
- Apr 2007
- Beiträge
- 30
Das ist leider auch nicht der Fall.
Ich habe meinen Netzwerktraffic mitgeschnitten und da kommt das Packet in einem rutsch an und hat nur einen Header und wenn ich den abschneide hilft das auch nicht.
Also stellt sich immernoch die Frage wie ich den socket.getInputStream(); in den GZIPInputStream bekomme ohne das die Exception kommt das dies kein GZIP Format ist.
-
Poste uns doch mal den kompletten Header bitte.
Ich bin immer noch der Meinung, dass das ganze im Transfer-Encoding "chunked" verschickt wird, wodurch du beim body selbst nochmal ein paar Dinge abschneiden musst.
-
25.02.08 18:11 #9
- Registriert seit
- Apr 2007
- Beiträge
- 30
das ganze schaut dann ungefär so aus
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
HTTP/1.1 200 OK Date: Mon, 25 Feb 2008 17:10:23 GMT Server: Apache/2.0.59 (Unix) PHP/4.4.4 X-Powered-By: PHP/4.4.4 connection: close cache-control: no-cache Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 1034 Content-Type: text/html X-Pad: avoid browser bug ‹ ¥VÛnÛ8}N€ü«Å:`ëbËv‹îK[ íb[lìc@‰#‰‰L)"e;-úçûС¤Èqš,6X²ÉÑçrffz¯NŽŽÂoVG¡:‡ÕeÉbðoɇ¼Ðdè´âVe š‘LërwµØP+.$*é±¾/Á"ÝŽZvÚ1F–$ÎX¥@Ó—_Æçç³`ìYÝa*®D©‰vˆ¶aÔ"ªŠ©1ö²V¡ÓÊ;h.ä-© §Jßç 2€îœæ˜X)’UPKgœ”ÁFaoØ€õ#m5ŽšÐ8}l¨à÷ÄèRë·Í¯£«PBÍ"<n+¸Îèlæ’òÜ2¥í®dœ·»(‹¼¨h”³ø–Æ&µÊB - y‘ˆð%É!Ñþ¢Ü-ÑŒ6&8É@¤™¦¾ÿ`å"•´½Ä›í]<×ý½‡jçL)¯Â¨_¾ äEèD ÍÿäZY¯_ºª0u[\Cõ:àß Fé"IƽÖÅVSg+ϵgø¸®KB±N›Rj+wÎ_Þg;ÉÞróí`:±Ïç³ga“—`Þ¿Z›¾[ؾ·°ƒ…ÿ,Ìk¼tš´?ÙDÕþéø”3™Ö,Ųú„tºlé´Jj›#†:׺¸6¤(ÙýðŒ|'V Ûë„bõH^lí¢9<5dW޳ÝníbspÞ+”à s²êã;ê jÕ,o>0š¸L·³AZº™@+êMÜi0üÉtg·ª^S‚ "¬Ô`âò˜óy<ç°˜ÇøÉÔwOG§_™ü©@‰oÆgzj„®yagi¶k5n¨,Fº(òn©4Óu«ð@ˆ‰?êx´˜Ÿ£nIÝ‘!uOÏ–G]줈k5<[’}Û “¢ZÖ„ZIÓí2+-"ÑUjUÊ"س‚Sëë—Ë+äeÝu¥Lp²S½³0Þy+׃„q™?>?ŸÅ|æÅ³9ây2ŸÀÎ[ì&³7·úü¶§|Ú·JlQ}vuŤ*‹J7ym+è›!G0HÚ®”7²ÛP}|üªòl.”‰2§òÉòér/Æ“ãGýûi¿lDƒÓÄ$ô¬ï¦Ð?R_Ä™Þóá•íQ«u}¿–BolMŠÞÞÑ×úW›Ì˜Ìí>wÛ?¡†np’oµbkˆÒØš›9zЮ_ûèQX³•Æa†DÜ‚)VÍ%ÜÖ’7'd‡ì?9&Ä<¿2ÿæ :PãÍxl~û:‘8ˆgߌ<>/bf^Úÿ?†Ksðó…£ÿJ¬¡¨õÐjZ#2ÅfyÖè8Û+î+„3}ÍÌ5Ó7lþH¬~ÖR©´
-
Hm. Der Verdacht auf Transfer-Encoding: Chunked ist damit vom Tisch.
Nimmst du auch exakt die in Content-Length angegebenen 1034 Bytes?
Eventuell nimmst du die den Header abshcliessende Leerzeile mit rein?
Wie liest du die HTTP_Response ein und verarbeitest sie weiter, bevor sie per GZIP dekomprimiert werden soll?
Eventuell ein Beispielcode, wie das bei dir im Programm aussieht?
-
26.02.08 12:50 #11
- Registriert seit
- Apr 2007
- Beiträge
- 30
Klar kein Thema
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
public static void Fcontentsenden ( String link, String content ) { try { URL seite = new URL(link); String hostname = seite.getHost(); int port = 80; InetAddress addr = InetAddress.getByName(hostname); Socket socket = new Socket(addr, port); BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")); <blabla> wr.write(content); wr.flush(); //und hier beginnt der Bastelteil InputStream is = socket.getInputStream(); byte[] buffer = new byte[ 1 ]; int length; int index = 0; String temp = ""; do { length = is.read(buffer); if(length != -1) { ziptext = ziptext + (char)buffer[0]; } } while(length != -1); index = ziptext.indexOf("Content-Length:") + 15; index = Ffindezahl(ziptext, index); //Ffindezahl ist eine Funktion die eine komplette zahl in einen String sucht die arbeitet zu 100% perfekt // klappt nicht ziptext = ziptext.substring(ziptext.length() - tempzahl); //tempzahl ist die Zahl aus dem String index = ziptext.indexOf("bug", index) + 7; ziptext = ziptext.substring(index); Fdateischreiben(ziptext, "cache.tmp"); //Fdateischreiben schreibt stumpf den String in eine Datei // klappt nicht InputStream isneu = new GZIPInputStream(new ByteArrayInputStream(ziptext.getBytes())); InputStream isneu = new GZIPInputStream(new FileInputStream("cache.tmp")); . . . } catch (Exception e) { System.out.println(e); } }
Die "//klappt nicht" ist der versuch den InputStream direckt weiter zu verarbeiten bei dem die Exception kommt.
Mit Ziptext in eine Datei schreiben und wieder zu laden klappt.
-
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
public void test(String link) { try { URL seite = new URL(link); String hostname = seite.getHost(); int port = 80; InetAddress addr = InetAddress.getByName(hostname); Socket socket = new Socket(addr, port); String content = "GET " + seite.getPath() + " HTTP/1.1" + "\nHost: " + seite.getHost() //+ "\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12" //+ "\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" //+ "\nAccept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" + "\nAccept-Encoding: gzip,deflate" //+ "\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" //+ "\nKeep-Alive: 300" //+ "\nConnection: keep-alive" + "\n\n"; System.out.println(content); BufferedWriter wr = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), "UTF8")); wr.write(content); wr.flush(); InputStream is = socket.getInputStream(); byte[] buffer = new byte[1]; int length; int index = 0; String temp = ""; System.out.println("read incoming data"); do { length = is.read(buffer); if (length != -1) { ziptext = ziptext + (char) buffer[0]; } } while (length > -1); index = ziptext.indexOf("\r\n\r\n") + 4; String body = ziptext.substring(index); System.out.println(body); InputStream isneu = new GZIPInputStream(new ByteArrayInputStream(body.getBytes())); do { length = isneu.read(); System.out.print((char)length); } while (length > -1); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Versuch's mal damit bitte.
Es wäre auch nett, wenn du mir den Link zu der Seite, die du abrufen willst, auch geben könntest, damit ich unter denselben Bedingungen testen kann.
Habe leider nur Server gefunden, die chunked und Gzipped oder ohne Gzip-Encoding antworten.
-
26.02.08 16:36 #13
- Registriert seit
- Apr 2007
- Beiträge
- 30
Dank dir für deinen Code aber leider hat er auch damit die Exception geworfen
java.io.IOException: Not in GZIP format
Nun wie du die Seite mit GET angefordert hast ist bei mir ganz ähnlich aufgebaut. Ich simuliere nur den Firefox 1.5 und sende dem Server POST daher auch mein content was ich hinten dran hänge.
Den Server nennen kann ich dir bezweifel aber das dir das so viel weiter hilft da es ein Browsergame ist und in dem link sowie in dem content ein Schlüssel drin stecken muss.
Der Server ist www.space4k.de
Ich begreif vor allem nicht das es funkioniert wenn ich es vorher in eine Datei schreibe
Muss vielleicht statt dem HTML Header ein anderer Header hin?
-
Ok, damit hatte sich mein letzter Verdacht bestätigt: Es gab Codierungsprobleme beim Umwandeln von byte in char.

Ich habde das ganze jetzt nur mit byte-Arrays gemacht und siehe da, es funktioniert. Ich habe dir aus einer meiner hilfsklassen die Methoden zur Suche eines byte[]-Patterns in einem byte[]-Array mit in die Testklasse eingefügt.
Viel Spaß!
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
package de.tutorials; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.Socket; import java.net.URL; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.zip.GZIPInputStream; import pp.util.StringUtilities; public class GZipURLTest { private static String ziptext = ""; public void test(String link) { try { URL seite = new URL(link); String hostname = seite.getHost(); int port = 80; InetAddress addr = InetAddress.getByName(hostname); Socket socket = new Socket(addr, port); String content = "GET " + seite.getPath() + " HTTP/1.1" + "\nHost: " + seite.getHost() //+ "\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12" //+ "\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" //+ "\nAccept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" + "\nAccept-Encoding: gzip,deflate" //+ "\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" //+ "\nKeep-Alive: 300" //+ "\nConnection: keep-alive" + "\n\n"; System.out.println(content); BufferedWriter wr = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), "UTF8")); wr.write(content); wr.flush(); InputStream is = socket.getInputStream(); byte[] buffer = new byte[1024]; int length; int index = 0; String temp = ""; byte[] data = null; System.out.println("read incoming data"); //Ansich unschön, die Arrays ständig zu kopieren, aber es funktioniert ;) do { length = is.read(buffer); if (length != -1) { if (data != null) { byte[] tempData = new byte[data.length + length]; System.arraycopy(data, 0, tempData, 0, data.length); System.arraycopy(buffer, 0, tempData, data.length, length); data = tempData; } else { data = new byte[length]; System.arraycopy(buffer, 0, data, 0, length); } } } while (length > -1); byte[] eoh = {13, 10, 13, 10}; // Markierung für das Ende des Headers index = indexOf(data, eoh) + 4; byte[] body = new byte[data.length - index]; System.arraycopy(data, index, body, 0, data.length - index); // Body aus der Response extrahieren InputStream isneu = new GZIPInputStream(new ByteArrayInputStream(body)); do { length = isneu.read(); System.out.print((char)length); } while (length > -1); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * Finds the first occurrence of the pattern in the text. Implements the * Knuth-Morris-Pratt Algorithm for Pattern Matching */ public int indexOf(byte[] data, byte[] pattern) { int[] failure = computeFailure(pattern); int j = 0; if (data.length == 0) return -1; for (int i = 0; i < data.length; i++) { while (j > 0 && pattern[j] != data[i]) { j = failure[j - 1]; } if (pattern[j] == data[i]) { j++; } if (j == pattern.length) { return i - pattern.length + 1; } } return -1; } /** * Computes the failure function using a boot-strapping process, where the * pattern is matched against itself. */ private int[] computeFailure(byte[] pattern) { int[] failure = new int[pattern.length]; int j = 0; for (int i = 1; i < pattern.length; i++) { while (j > 0 && pattern[j] != pattern[i]) { j = failure[j - 1]; } if (pattern[j] == pattern[i]) { j++; } failure[i] = j; } return failure; } public static void main(String[] args) { GZipURLTest t = new GZipURLTest(); t.test("http://www.space4k.de/"); } }
-
26.02.08 18:21 #15
- Registriert seit
- Apr 2007
- Beiträge
- 30
STRIKE
Ich bedanke mich in verschärfster Form für die Hilfe.
Klappt super sowohl bei GET als auch bei POST.
Verstehe nur nicht so ganz was deine zwei Funktionen machen.
Ähnliche Themen
-
Javascript und Gzip
Von tomengel im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 14.01.11, 13:27 -
entpacken von gzip verzeinisse
Von thebig im Forum PHPAntworten: 1Letzter Beitrag: 09.03.09, 17:18 -
Gepackte Seite (GZip) entpacken
Von ZodiacXP im Forum PHPAntworten: 0Letzter Beitrag: 07.03.09, 18:47 -
Gzip entkomprimieren in vb.net
Von flotschie im Forum .NET ArchivAntworten: 0Letzter Beitrag: 13.07.04, 23:04 -
Forum und gzip
Von Patrick Kamin im Forum PHPAntworten: 3Letzter Beitrag: 28.02.02, 07:48





Zitieren

Login





