tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
3469
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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
     

  2. #2
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    Registriert seit
    Apr 2007
    Beiträge
    30
    sorry für doppelpost aber mein browser wollte nich so wie ich wollte
     

  3. #3
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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.
     

  4. #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ß Tom
     
    Java 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

  5. #5
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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?
     

  6. #6
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    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
     

  7. #7
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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.
     

  8. #8
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    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.
     

  9. #9
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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ërwµØ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©´
     

  10. #10
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    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?
     

  11. #11
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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.
     

  12. #12
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    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.
     

  13. #13
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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?
     

  14. #14
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    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/");
        }
    }
     

  15. #15
    thunderbirdnils thunderbirdnils ist offline Mitglied Bronze
    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

  1. Javascript und Gzip
    Von tomengel im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 14.01.11, 13:27
  2. entpacken von gzip verzeinisse
    Von thebig im Forum PHP
    Antworten: 1
    Letzter Beitrag: 09.03.09, 17:18
  3. Gepackte Seite (GZip) entpacken
    Von ZodiacXP im Forum PHP
    Antworten: 0
    Letzter Beitrag: 07.03.09, 18:47
  4. Gzip entkomprimieren in vb.net
    Von flotschie im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 13.07.04, 23:04
  5. Forum und gzip
    Von Patrick Kamin im Forum PHP
    Antworten: 3
    Letzter Beitrag: 28.02.02, 07:48