Proxy Programm

Shadow

Mitglied
Hallo!

Ich hoffe jemand kann mir bei meinem "Problem" helfen.
Ich soll mittels HTTP/1.0 - also die Anfrage eines Browsers an einen Proxy weiterleiten, der dann die angeforderte Website liest und an den Browser zurückgibt.
Nun besteht mein Problem darin, dass ich quasi 2 Abfragen habe, die einerseits überpfrüfen auf HTML/Text oder ob es sich z.B. um ein Bild handelt.
Ich habe irgendwo gelesen, dass man dies in einem Schritt machen kann - also nur ein InputStream bzw. OutputStream....

Ich habe zwar schon eine Variante die funktioniert, aber vielleicht weiss jemand von euch wie man diese Methode effizienter gestaltet. (ist eben mit 2 In- und 2 OutputStreams)

Code:
  /**
   * Diese Methode liefert die eigentliche Website. Man muss zwischen 2 Verbindungen
   * unterscheiden. In dieser Methode wird ein Input für HTML und ein Input für Daten 
   * erzeugt.
   */
private void getWebsiteContent() {
    // Quelle:
    // http://www.galileocomputing.de/openbook/javainsel4/javainsel_16_002.htm#Rxx365java160020400062E1F028114
    try {
      URL connectionToWeb = new URL(this.path);
      URLConnection connection = null;

      try {
        connection = connectionToWeb.openConnection();
      }
      catch (IOException ex1) {
        System.out.println("Verbindung zu Webserver konnte nicht aufgebaut werden.");
      }

      try {
        // Leser für normale html Seiten.
        BufferedReader readNormalWebsite = new BufferedReader(
            new InputStreamReader(connection.getInputStream()));

        // schreibt zum Clienten
        OutputStream writeWebsite = socket.getOutputStream();

        // InputStream für Dateien.
        InputStream readDataWebsite = connectionToWeb.openStream();

        // ####################################################
        clientOut.println( "HTTP/1.0 200 OK" );
        clientOut.println( "Date            : " + new Date(connection.getDate()) );
        clientOut.println( "Last Modified   : " + new Date(connection.getLastModified()) );
        clientOut.println( "Content encoding: " + connection.getContentEncoding() );
        // clientOut.println( "Content type    : " + connection.getContentType() );
        // clientOut.println( "Content length  : " + connection.getContentLength() );
        clientOut.println();
        // ####################################################

        // wenn es sich um eine "NORMAL" Seite handelt.
        if (connection.getContentType().equals("text/html"))
        {
          webserverResponse = "";
          String line = "";
          while ( (line = readNormalWebsite.readLine()) != null) {
            webserverResponse = webserverResponse + line;
          }
          clientOut.println(webserverResponse);
        }

        // wenn es sich um eine Datei handelt - Bilder etc.
        else
        {
          byte data[] = new byte[connection.getContentLength()];
          int number=0, end=0;

          for(int start=0; start<connection.getContentLength();)
          {
            end=connection.getContentLength()-start;
            number = readDataWebsite.read(data, start, end);
            start = start + number;
          }
          writeWebsite.write(data, 0, connection.getContentLength());
          writeWebsite.flush();
        }

        readNormalWebsite.close(); // InputStream schließen
        writeWebsite.close(); // OutputStream schließen
        readDataWebsite.close(); // InputStream schließen
      }
      catch (IOException ex) {
       ex.printStackTrace();
       System.out.println("FEHLER");
      }
    }
    catch(MalformedURLException e) {
      e.printStackTrace();
      System.out.println("Zur angegeben URL konnte nicht verbunden werden !");
    }
  }


mfg
 
Der Unterschied besteht in der Zeichenlesung:

- "...Reader" = Uni-Code (Characters)
- "...Stream" = Bytes

InputStreamReader ist sozusagen der Übersetzer zwischen beiden Formaten.

Wichtig:
Bilder oder Programm-Dateien nie mit "...Reader" lesen! Die sind byte-basiert abgespeichert.

CU schnuffie :eek:
 
hallo !

Danke für die Anwort !

nun ja... das mit bytebasierend war schon klar... nur dachte ich, dass man nicht unbedingt eine trennung, so wie ich es gemacht habe (zwischen dateien und text), vornehmen muss...
najo

Ja die Ausgabe passiert bei mir so:
InputStream readDataWebsite = connectionToWeb.openStream();


mfg
 
Zurück