Angewandte Netzwerktechnik kompakt

Material zum Buch

zu Kapitel 5.6 (GET und POST)


Für Kapitel 5.6 stehen uns die Klassen HTTPClient_GET und HTTPClient_POST zur Verfügung, mit denen eine Get- bzw. Post-Anfrage an einen Server gesendet, Daten abgerufen und ausgegeben werden können. Bei der Klasse HTTPClient_POST werden mit der Anfrage außerdem zusätzliche Daten in Form vom Name-Wert-Paaren (im Beispiel Benutzername und Passwort) an den Server übermittelt.

Zur Verwendung der beiden Klassen wird die Bibliothek HTTPClient benötigt. Die Bibliothek ist unter http://hc.apache.org abrufbar. Alle benötigten Verweise sind bereits in den Klassen vorhanden. Kapitel 5.6.1 im Buch beschreibt, wie die Bibliothek zu einem Eclipse-Projekt hinzugefügt werden kann.

An Ende dieser Seite finden Sie eine Vorschau der Java-Klassen.

zu Kapitel 5.7 (SPS Webserver Teil 2)


Das Begleitmaterial zu Kapitel 5.7 umfasst das Java-Programm SiemensAnmeldungAbruf für den Zugriff auf den Webserver einer SPS, sowie die HTML-Dokumente Zaehler.html, über welches sich der Zählerstand setzen und ändern lässt und Zaehlerzusatz.html, in welchem der Zählerstand steht.

Der Ablauf des Programms beginnt mit der Übermittlung von Benutzername und Passwort mittels einer POST-Anfrage, anschließend wird das Dokument Zaehlerzusatz.html vom Webserver abgerufen und der Zählerstand extrahiert.

Desweiteren befindet sich zur Ergänzung im ZIP-Archiv die Wireshark-Aufzeichnung der Kommunikation mit dem SPS-Webserver und das SPS-Projekt 1513_Buch_Plenk_2_WWW.zap13, welches eine Variable im Sekundentakt hochzählt. Das Dokument Zaehlerzusatz.html aktualisiert sich ebenfalls sekündlich und zeigt daher immer den aktuellen Zählerstand an.

Der Inhalt dieses ZIP-Archivs zu ist identisch mit dem von Kapitel 4.8 (SPS Webserver Teil 1).

zu Kapitel 5.8 (JSON-Datei über HTTP abrufen)


Für Kapitel 5.8 stehen uns die Klassen HTTP_GET_JSON, Student und Leistung zur Verfügung. Sie ermöglichen uns, JSON-Daten per HTTP-GET-Anfrage von einem Server abzurufen und optisch ansprechend auf der Konsole auszugeben.

Zur Verwendung der Klasse HTTP_GET_JSON wird die Bibliothek Gson benötigt, welche Daten aus dem InputStreamReader heraus direkt in das JSON-Format umsetzen kann. Die Bibliothek ist unter http://code.google.com/p/google-gson abrufbar. Alle benötigten Verweise sind bereits in der Klasse vorhanden. Abbildung 3.1 im Buch zeigt, wie die Bibliothek zu einem Eclipse-Projekt hinzugefügt werden kann.

zu den Übungsaufgaben (Webserver)


Die folgenden Beispielseiten mit unterschiedlichen Funktionalitäten dienen zum Testen der von uns programmierten HTTP-Clients.






Vorschau der Java-Klassen zu Kapitel 5.6


HTTPClient_GET.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HTTPClient_GET {

	public static void main(String[] args) throws ClientProtocolException, IOException {
		
		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpGet httpGet = new HttpGet("http://angewnwt.hof-university.de/example-1.php");
		
		CloseableHttpResponse response = httpClient.execute(httpGet);
		
		System.out.println(response.getStatusLine());
		
		HttpEntity entity = response.getEntity();
		InputStream netzwerkStream = entity.getContent();
		InputStreamReader netzwerkStreamReader = new InputStreamReader(netzwerkStream);
		BufferedReader bufNeRd = new BufferedReader(netzwerkStreamReader);
		
		String geleseneZeile;
		while((geleseneZeile = bufNeRd.readLine()) != null) {
			System.out.println(geleseneZeile);
		}
		
		EntityUtils.consume(entity);
		response.close();
	}
}

HTTPClient_POST.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public class HTTPClient_POST {

	public static void main(String[] args) throws ClientProtocolException, IOException, URISyntaxException {
		
		CloseableHttpClient httpClient = HttpClients.createDefault();		
		HttpPost httpPost = new HttpPost("http://angewnwt.hof-university.de/login.php");
		
		List  nvps = new ArrayList ();
		nvps.add(new BasicNameValuePair("username","Hans"));
		nvps.add(new BasicNameValuePair("password", "Wurscht"));
		httpPost.setEntity(new UrlEncodedFormEntity(nvps));
		
		CloseableHttpResponse response = httpClient.execute(httpPost);
		
		System.out.println(response.getStatusLine());
		
		HttpEntity entity = response.getEntity();
		InputStream netzwerkStream = entity.getContent();
		InputStreamReader netzwerkStreamReader = new InputStreamReader(netzwerkStream);
		BufferedReader bufNeRd = new BufferedReader(netzwerkStreamReader);
		
		String geleseneZeile;
		while((geleseneZeile = bufNeRd.readLine()) != null) {
			System.out.println(geleseneZeile);
		}
		
		EntityUtils.consume(entity);
		response.close();
	}
}

Vorschau der Java-Klasse zu Kapitel 5.7


SiemensAnmeldungAbruf.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;


// Demoprogramm für Anmeldung  am Siemens Webserver und Abruf des Zählerstandes
public class SiemensAnmeldungAbruf
{
	public static void main(String[] args) throws ClientProtocolException, IOException, URISyntaxException {

		// HTTP-Client für die Abfragen erzeugen
		CloseableHttpClient httpclient = HttpClients.createDefault();
	    
		
        //==========================
		// Anmelden durch POST des Passworts
		System.out.println("=====================\nPOST Login");
        HttpPost httpPost = new HttpPost("http://10.50.80.18/FormLogin.php");
        List  nvps = new ArrayList ();
        nvps.add(new BasicNameValuePair("Login", "student"));
        nvps.add(new BasicNameValuePair("Password", "geheim"));
        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
        CloseableHttpResponse response1 = httpclient.execute(httpPost);

        System.out.println(response1.getStatusLine());
        HttpEntity entity1 = response1.getEntity();
    	// Antwort ist irrelevant und wird deswegen nicht gelesen
		EntityUtils.consume(entity1);
		response1.close();

		//===================
		// GET der benutzerdefinierten Webseite (nach Anmeldung)
		System.out.println("=====================\nGET nach Anmeldung");
		HttpGet httpGet = new HttpGet("http://10.50.80.18/awp/Zaehler/Zaehlerzusatz.html");
		
		response1 = httpclient.execute(httpGet);
		System.out.println(response1.getStatusLine());
		
		entity1 = response1.getEntity();
		InputStream httpStream  = entity1.getContent();
		InputStreamReader httpStreamReader = new InputStreamReader(httpStream);
		BufferedReader httpBufferedReader = new BufferedReader(httpStreamReader);

		// Zeile mit dem Zählerstand suchen
		String httpLine;
		while((httpLine = httpBufferedReader.readLine()) != null) {
			if(httpLine.contains("Zählerstand:"))
			{
				// die eigentlichen Ziffern aus der Zeile ausschneiden
				int startZaehler = httpLine.indexOf("Zählerstand:") + "Zählerstand:".length();
				int endeZaehler = httpLine.indexOf("") - 1;
				String standAlsString = httpLine.substring(startZaehler, endeZaehler);
				standAlsString = standAlsString.trim();
				// und in int umwandeln
				int zaehlerstand = Integer.parseInt(standAlsString);
				System.out.println("Zaehlerstand: " + zaehlerstand);
			}
		}
		httpBufferedReader.close();
		EntityUtils.consume(entity1);
		response1.close();
	}

}

Vorschau der Java-Klassen zu Kapitel 5.8


HTTP_GET_JSON.java

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class HTTP_GET_JSON {

	public static void main(String[] args) throws ClientProtocolException, IOException {
		// HTTP Client erzeugen
		CloseableHttpClient httpClient = HttpClients.createDefault();
		
		// GET Request auf Server mit JSON-Datei
		HttpGet httpGet = new HttpGet("http://angewnwt.hof-university.de/Kap-3/JSON-Datei");

		CloseableHttpResponse response = httpClient.execute(httpGet);

		// Server-Meldung ausgeben
		System.out.println(response.getStatusLine());

		// Stream auf JSON-Datei erstellen
		HttpEntity entity = response.getEntity();
		InputStream httpStream = entity.getContent();
		
		InputStreamReader isr = new InputStreamReader(httpStream,"UTF-8");
		
		// HTTP-Stream durch GSON parsen lassen
		Student[] geleseneStudenten;
		Gson gson = new GsonBuilder().create();
		geleseneStudenten = gson.fromJson(isr,Student[].class);
		
		isr.close();
		httpStream.close();

		// gelesene Daten auf Konsole ausgeben
		String toWrite;
		if(geleseneStudenten != null) {
			toWrite = String.format("%d",geleseneStudenten.length );
			// Elemente mit ; und Leerzeichen trennen
			toWrite += "; ";
			// Text als Zeile schreiben
			toWrite += "\n";
			System.out.print(toWrite);
	
			for(int i=0; i < geleseneStudenten.length; i++) {
				// neuen Text beginnen
				toWrite = String.format("%d; %s; ",
						geleseneStudenten[i].matrikelNummer,
						geleseneStudenten[i].name);
				if(geleseneStudenten[i].leistungen != null) {
					// Text ergaenzen
					toWrite += String.format("%d; ",geleseneStudenten[i].leistungen.length);

					for(int j=0; j < geleseneStudenten[i].leistungen.length; j++) {
						toWrite += String.format("%s; %3.1f; ",
								geleseneStudenten[i].leistungen[j].modul,
								geleseneStudenten[i].leistungen[j].note);
					}
				}
				else
					toWrite += "0; ";
				// Text / Datensatz eines Studenten als Zeile ausgeben
				toWrite += "\n";
				System.out.print(toWrite);
			}
		}
		else
		{
			toWrite = "0; \n";
			System.out.print(toWrite);
		}
		
		// Aufraeumen
		EntityUtils.consume(entity);
		response.close();
	}

}

Leistung.java

public class Leistung {
	String modul;
	double note;
}

//
// 4711 - Hans Muster
// Leistungen - REN 1,0
// 		      - GdaT 5,0
// 4712 - Erika Muster
// Leistungen - keine also Wert == null

Student.java

public class Student {
	int matrikelNummer;
	String name;
	Leistung[] leistungen;
}