# Problem beim Lesen des Codes...



## beshay (8. Nov 2014)

Hallo Ihr da draußen, ich habe einige Schwierigkeiten beim Lesen des Codes.

Den habe ich in einem 'alten' Ordner gefunden und würde gerne wissen was passiert. Ein paar sachen habe ich bereits rausgefunden, aber der Rest ist mir nicht schlüssig...

Es geht darum einen Server anzupeilen...man gibt die Adresse und den Port ein. Warum wird aber der String in einen charArray umgewandelt? muss das sein?




```
class Client {

	public static void main(String[] args) {
		try {
			// Anfang Eingabe
			String adresse;
			System.out.print("Adresse mit Port eingeben: ");
			BufferedReader adresseR = new BufferedReader(new InputStreamReader(
					System.in));
			adresse = adresseR.readLine(); // Eingabe auf Adresse

			char[] c;
			c = adresse.toCharArray(); // String in CharArray umwandeln
			String puffer = "";
			String method = "";
			String urlpuff = "";
			int v = adresse.length(); // Laenge des Strings
			int x = 0;
			// Methode auslesen (String bis zum ersten Leerzeichen)
			for (int i = 0; i < v; i++) {
				if (c[i] != ' ') {
					puffer = puffer + String.valueOf(c[i]);
				} else {
					method = puffer;
					x = i;
				}
			}

			puffer = "";
			// URL auslesen
			for (int i = (x + 1); i < v; i++) {
				puffer = puffer + String.valueOf(c[i]);
			}
			urlpuff = puffer;
			URL host = new URL(urlpuff);
			// Zerlegung der URL
			String host1 = host.getHost();
			String protocol = host.getProtocol();
			String path = host.getPath();
			int port = host.getPort();
			if (port < 0)
				port = 80; // fuer den Fall dass Port nicht angegeben wird ist er 80
			System.out.println(path);
			if (path.isEmpty()) {
				path = "/";
			}
			// Anfang Kontrollausgabe
			System.out.println(method);
			System.out.println(protocol);
			System.out.println(host1);
			System.out.println(port);
			System.out.println(path);
			// if (path==null){path= "/index.html";}
			// Ende Kontrollausgabe
			// Ende Eingabe

			// Verbindungsaufbau
			Socket socket = new Socket(host1, port);

			// "Kanal" zum Server
			OutputStream out = socket.getOutputStream();
			OutputStreamWriter out2 = new OutputStreamWriter(out);
			PrintWriter out1 = new PrintWriter(out2);

			System.out.println("vor der anfrage");
			// Anfrage an den Server
			System.out.println(method + ' ' + path + ' ' + protocol);
			System.out.println("Host: " + host1);
			out1.print(method + ' ' + path + ' ' + protocol + "\r\n");
			out1.print("Host: " + host1 + "\r\n" + "\r\n");

			// out1.println("test");
			System.out.println("vor flush");

			out1.flush(); // startet Uebertragung

			// mit BR Antwort vom Server puffern und an s uebergeben
			BufferedReader in = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			String s = in.readLine();

			// Abfangen der Codes und sinnvolles Kommentar dazu
			if (s.contains("200")) {
				System.out.println("\r\n" + "Alles ist gut.");
			}
			if (s.contains("400")) {
				System.out.println("\r\n" + "Syntaktisch falsche Eingabe.");
			}
			if (s.contains("404")) {
				System.out.println("\r\n" + "Datei nicht gefunden.");
			}
			if (s.contains("501")) {
				System.out.println("\r\n" + "Serverfehler.");
			}
			System.out.println();
			System.out.println();

			// Ausgabe der ersten Zeile
			System.out.println(s);
			// Ausgabe alller weiteren
			while ((s = in.readLine()) != null)
				System.out.println(s);

			// socket schliessen
			socket.close();

			// BufferedReader schliessen
			in.close();
		}

		catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```


----------



## JavaMeister (9. Nov 2014)

Ja, es muss sein, da hier pport und Adresse und andere Sachen ausgelesen werden.

---

Und google mal nach "Wie man Fragen richtig stellt".

Und was soll  das mit der Umfrage???


----------



## fehlerfinder (9. Nov 2014)

Hallo und willkommen im Forum ;-)

ich habe einfach mal geschaut, was denn mit diesem char-Array gemacht wird. Da wird also die Eingabezeile Zeichen für Zeiche an einen puffer angehängt, vorausgesetzt, es ist kein Leerzeichen. Ist es doch ein Leerzeichen, wird der puffer zu einer method umkopiert. Das könnte man sicherlich auf über ein String.indexOf() und anschließendem String.substr() erreichen. Dann wäre es evtl. etwas intuitiver. Ich vermute aber mal, dass die char-Array Variante schneller ist.

Allerdings geht der (gemutmaßte) Geschwindigkeitsvorteil schnell wieder flöten, weil die for-Schleife einfach weiter arbeitet, nachdem die Methode schon gefunden ist, d.h. die komplette Eingabezeile wird bis zum Ende gelesen. Das mag undramatisch sein, wenn tatsächlich nur zwei Angaben enthalten sind. Sobald aber noch ein zweites Leerzeichen auftritt, wird deine Methode überschrieben und auch das x für die weitere Verarbeitung - ab dann könnte es kompliziert (oder schlicht falsch) werden.

Weiterhin viel Erfolg beim "Dechiffrieren" ;-)


----------

