// Vernetzte Systeme, WS00/01, Serie 5 // // Demonstration des HTTP/1.0-Protokolls: // Benutze HEAD um den Datentyp zu erkennen // falls Text, lade Daten und gib die Nutzdaten aus (ohne Header) import java.net.*; import java.io.*; public class UserAgent22c_http10 { public static void load(String host, String url) throws IOException { Socket s = new Socket(host, 80); PrintWriter s_out = new PrintWriter(s.getOutputStream()); BufferedReader s_in = new BufferedReader(new InputStreamReader(s.getInputStream())); s_out.println("HEAD /"+url+" HTTP/1.0"); s_out.println(); s_out.flush(); // automatisches flushing kann man auch im Konstruktor angeben String line; String typeStr = ""; while (true) { line = s_in.readLine(); // Abschluss der Header-Daten wird durch Leerzeile angezeigt if (line.length() == 0) { break; } if (line.startsWith("Content-Type:")) { typeStr = line.substring("Content-Type: ".length()); } } s.close(); // Falls Text, sende zweiten Request, um Daten zu holen if (typeStr.startsWith("text/")) { // Oeffne neue Verbindung s = new Socket(host, 80); s_out = new PrintWriter(s.getOutputStream()); s_in = new BufferedReader(new InputStreamReader(s.getInputStream())); s_out.println("GET /"+url+" HTTP/1.0"); s_out.println(); s_out.flush(); // Lese Daten und gib Nutzdaten aus boolean inHeader = true; // Ende der Uebertragung: line == null // Ende der Header-Daten durch Leerzeile while ((line = s_in.readLine()) != null) { if (inHeader && line.length() == 0) { inHeader = false; } else if (!inHeader) { System.out.println(line); } } s.close(); } else { System.out.println("[Kann Daten vom Typ '"+typeStr+"' nicht anzeigen]"); } } public static void main(String[] args) throws IOException { if (args.length < 2) { System.err.println("Bitte zwei Parameter angeben: "); System.exit(1); } load(args[0], args[1]); } }