GZIP entpacken

Klar kein Thema

Java:
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:
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.
 
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 http://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:
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/");
	}
}
 
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.
 
Die beiden Funktionen implementieren einen Suchalgorithmus, der in einem byte[]-Array die Position des ersten Musters zurückgibt. Letztendlich daselbe, wie wenn du String.indexOf("test") benutzt.

Bitte noch das Thema als erledigt markieren.

Viel Erfolg weiterhin!
 
Zurück