Beispiele - Michael Hielscher

Werbung
Netzwerkprogrammierung
Sommersemester 2007
Inhalt der LV


Grundlegende Begriffe
Konzepte des WWW



Socketprogrammierung



Java RMI
.NET Remoting
RMI und .NET Remoting Callbacks
WebServices
Anwendungen im Web-Browser



Dynamisch Klassen über Netzwerke laden
Remote Technologien





TCP Client/Server
UDP / UDP Multicast
Java Socketprogrammierung


HTML (DOM, JS, CSS, XHTML)
HTTP Protokoll
Java Applets
.NET im Browser
Java Servlets und Java Server Pages (JSP)
Netzwerkprogrammierung
2
Grundlegende Begriffe

Computernetzwerke
 Ansammlung
von Computern und anderen
Geräten, welche Informationen austauschen
und bereitgestellte Dienste nutzen
Netzwerkprogrammierung
3
Grundlegende Begriffe

Client / Server Modell
 Server
stellt Dienste zur Verfügung
 Client(s) greifen auf diese Dienste zu
 Server und Client können sich auch beide auf dem
selben Rechner befinden
 Client initiiert die Verbindung zum Server (in der
Regel)


Clients kennen die Adresse des Servers
Server kennt erst seine Clients, wenn sich diese bei ihm
anmelden
Netzwerkprogrammierung
4
Grundlegende Begriffe
Mail Server
Drucker Server
Clients
Datenbank Server
Client – Server Modell
Netzwerkprogrammierung
5
Grundlegende Begriffe

Netzwerkkommunikation
 Kommunikation
beschrieben durch das
OSI Schichtenmodell
Netzwerkorientiert Schicht 1-4 im OSI
 Anwendungsorientiert Schicht 5-7 im OSI

Netzwerkprogrammierung
6
Grundlegende Begriffe
OSI Referenzmodel - Zusammenbau des Pakets
Netzwerkprogrammierung
7
Grundlegende Begriffe
Einordnung der Protokolle
 Paket wieder einlesen
 Auspacken wie
Kisten in Kisten

Netzwerkprogrammierung
8
Grundlegende Begriffe

IP Paket – Header
z.B.: 0x06 für TCP oder 0x11 für UDP

Dem Header folgt Datenbereich
(z.B.: TCP Paket)
Netzwerkprogrammierung
9
Grundlegende Begriffe

TCP/IP
 Seit
Mitte der 90er: eingesetzt für WWW
 Im OSI Transport Layer (Schicht 4)
 Full Duplex (Daten senden und Empfangen
gleichzeitig möglich)
 Paketorientiert
 Verbindungsorientiert – Dauerverbindung /
Standleitung
Netzwerkprogrammierung
10
Grundlegende Begriffe
Rechner 1
Rechner 2
SEQ: 1 A
CK: 5 [D
ACK : 1
SEQ: 6
SEQ: 2 AC
K: 6
AC
SEQ: 7
ATA]
[DATA]
[DATA]
TCP
Datenaustausch
und Bestätigung
ATA]
K: 2 [D
Netzwerkprogrammierung
11
Grundlegende Begriffe
Rechner 1
Rechner 2
SEQ: 1 A
CK: 5 [D
TimeOut .
X
ACK : 1
SEQ: 6
SEQ: 1 AC
K: 5
AC
SEQ: 6
ATA]
[DATA]
Neuer Versuch
Packet 1 zu
übertragen
[DATA]
TCP Timeout
und erneutes
Senden
ATA]
K: 1 [D
Netzwerkprogrammierung
12
Grundlegende Begriffe

UDP
 unsicher
(keine Empfangsbestätigung)
 Datagramme sind untereinander unabhängig
 Keine Prüfung ob Empfänger überhaupt
online ist
 UDP ähnlich einer Postwurfsendung (Spam)
und TCP ähnlich eines Telefonanrufs
Netzwerkprogrammierung
13
Grundlegende Begriffe
UDP Pakete werden
verschickt aber
keine Bestätigung
zurückgesendet
Empfänger
Sender
Netzwerkprogrammierung
14
Grundlegende Begriffe
Sendet UDP
Packet
Netzwerk
Ein UDP Broadcast
Datagramm wird ins
Netz geschickt
Alle Rechner im
Netz empfangen das
Paket
Netzwerkprogrammierung
15
Grundlegende Begriffe

In C oder ASM



Verwendung und Konstruktion von TCP/UDP Paketen mitunter
per Hand
Empfang und Bufferung dem Entwickler selbst überlassen
In höheren Programmiersprache (Java, .NET,..)



Stream Gedanke – Verarbeitung der Netzwerkverbindung wie
eine lokale Datei
Bufferung kann durch das Framework automatisch erfolgen
Damit leichtere Entwicklung, aber weniger spezial Lösungen
möglich (neue Protokolle oder ähnliches)
Netzwerkprogrammierung
16
Grundlegende Begriffe

URLs
Resource Locator (URL, engl. „einheitlicher
Quellenanzeiger“)
 Symbolische Adresse www.hs-zigr.de und
physikalische Adresse 141.46.8.60
 Unterkategorie von URI (Uniform Resource Identifier)
 URI bezieht alle Schemas ein (file:// mailto: file://)
URL eigentlich nur http:// und ftp://
 Uniform
Netzwerkprogrammierung
17
Grundlegende Begriffe

Proxy Server
 Befindet sich zwischen lokalem Netz und Internet
 Proxy Server holt angeforderte Daten aus dem
Internet und gibt sie zum anfragendem Rechner
stellvertretend weiter
 In Application-Schicht angesiedelt
 Caching möglich
 Nachteile: meist nur wenige Protokolle erlaubt,
Programme wie ICQ funktionieren über einen Proxy
Server oftmals nicht
 Vorteil: kann beschleunigen, kann mehr Sicherheit
bieten, da Clients nicht selbst ins Netz gehen
Netzwerkprogrammierung
18
Grundlegende Begriffe
Intranet
Internet /
Netzwerk
Ziel-Server
(Web-Server)
Proxy-Server
Anwender-Rechner
Proxy-Server Modell
Netzwerkprogrammierung
19
Grundlegende Begriffe

Ports und Sockets






URLs zur Adressierung einzelner Knoten im Netz (Rechner)
Serverprozess selbst muss adressiert werden
(welche Dienst soll angesprochen werden)
Port – jeder Dienst bekommt eine Nummer
Jede Portnummer kann nur einmal vergeben werden auf einem
Rechner
Erstellt man einen neuen Dienstprozess bekommt dieser vom
System einfach einen freien Port zugewiesen
(bei Serverprozessen meist unerwünscht)
Jeder Port entspricht einem Socket (Steckdose)
Netzwerkprogrammierung
20
Grundlegende Begriffe
Rechner 1
Rechner 2
S
S
Socketverbindung
Ports
Ports
(einige offen einige
(einige offen einige
geschlossen)
geschlossen)
# 1 - 65536
Netzwerkprogrammierung
21
Grundlegende Begriffe

Standardisierte Ports (well known - TCP):






80: http (Webserver)
21: ftp (Fileserver)
22: sftp (sicherer Fileserver)
25: smtp (Email-Versanddienst)
…
Operationen auf Sockets:





Öffnen
Lesen / Schreiben
Schließen
Hören (auf eingehende Verbindung warten)
Akzeptieren (eine eingehende Verbindung annehmen)
 Binden (einem Serverprozess einen ganz bestimmten Port zuweisen)
Netzwerkprogrammierung
22
Konzepte des WWW


HTML
Entstehung:
 In

der Schweiz (Genf) 1989  USA (MIT)
Eigenschaften:
 Geräteunabhängig
 Sprache
zur Darstellung von Inhalten wie Texten,
Bildern und Hyperlinks in Dokumenten
 Kein Seitenkonzept wie etwa bei PostScript
Netzwerkprogrammierung
23
Konzepte des WWW

Aufbau eines HTML Dokuments:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Titel der Webseite</title>
</head>
<body>
Inhalt der Webseite
</body>
</html>
Netzwerkprogrammierung
24
Konzepte des WWW

Tags und Attribute
 <TAG>…</TAG>
 <TAG
attribut1="abc">…</TAG>
 Bis auf wenige Ausnahmen wie XML

Heute immer mehr XHTML
 HTML
welches XML konform ist
z.B.: <br> muss nun <br/> sein
 <img src="pic.jpg" />

Netzwerkprogrammierung
25
Konzepte des WWW

CSS (Cascading Style Sheets)
 legt
fest, wie ein besonders ausgezeichneter
Inhalt in einem HTML/XML Dokument
dargestellt wird
 Kann sowohl als separate Datei angelegt
werden, oder in das HTML Dokument
eingebettet werden
Netzwerkprogrammierung
26
Konzepte des WWW

CSS (Cascading Style Sheets)
Netzwerkprogrammierung
27
Konzepte des WWW

<input name="e1" style="border:none;
border-bottom: 2px dashed black;" />

Gute Beispiele und Referenz:
http://de.selfhtml.org/
Netzwerkprogrammierung
28
Konzepte des WWW

JavaScript
 Clientseitige
Programmiersprache in HTML
eingebettet (oder externe Datei)
 Erlaubt dynamische Inhalte
 Erweitert die Möglichkeiten von HTML
grundlegend (JavaScript hier stellvertretend
für alle Browser-Scriptsprachen wie VBScript)
Netzwerkprogrammierung
29
Konzepte des WWW

JavaScript und DOM
 HTML
Seite ist zur Laufzeit durch ein DOM Object
(Document Object Model) beschrieben
 Per JavaScript kann das DOM verändert werden
 http://de.selfhtml.org/dhtml/beispiele/anzeige/datumu
hr.htm
 http://de.selfhtml.org/javascript/beispiele/anzeige/tasc
henrechner.htm
Netzwerkprogrammierung
30
Konzepte des WWW

Hinweis:
 Um
heute dynamische Webanwendungen zu
entwickeln, ist JavaScript, DOM, CSS ein
Muss!
 Wenn Sie etwas Freizeit haben, schauen Sie
sich Beispiele in SelfHTML an und entwickeln
Sie selbst kleine dynamische HTML Seiten
Netzwerkprogrammierung
31
Konzepte des WWW

HTTP Hypertext Transfer Protocol
 Aufbau
der Verbindung des Webbrowsers
mittels TCP/IP
 TCP Paketinhalt in Form von HTTP
 HTTP ist ein Klartext-Protokoll
(man kann es als Mensch lesen)
 HTTP-Request und HTTP-Response
(Anfrage und Antwort)
Netzwerkprogrammierung
32
2
Web-Server
(www.google.de)
3
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-excel, application/
vnd.ms-powerpoint, application/msword, application/x-icq, */*
Accept-Language: de
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET
CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 127.0.0.1:81
Connection: Keep-Alive
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html
Set-Cookie:
PREF=ID=5d5b86a54ea78fff:TM=1172152002:LM=1172152002:S=yRZ
ldpnO3qqV9
FoT; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/;
domain=.google.com
Server: GWS/2.1
Transfer-Encoding: chunked
Date: Thu, 22 Feb 2007 13:46:42 GMT
1
4
Client
<html><head><meta http-equiv="content-type" content="text/html;
charset=ISO-8859
-1"><title>Google</title><style><!-body,td,a,p,.h{font-family:arial,sans-serif}
.h{font-size:20px}
.h{color:#3366cc}
.q{color:#00c}
--></style>
<script>
<!-function sf(){document.f.q.focus();} ……………
Netzwerkprogrammierung
33
Konzepte des WWW



Größte Bedeutung hat jeweils die 1. Zeile
Andere Angaben sind meist nicht zwingend nötig
Ergebniscodes





Content-Typen (MIME-Typen)








200-299 Erfolg (alles Ok)
300-399 Umleitung (auf andere Seite)
400-499 Fehler Clientseite (z.B.: falsche URL eingegeben)
500-599 Fehler Serverseite (ein Serverscript hat Fehler verursacht)
text/html
text/plain
image/gif
image/jpeg
application/octet-stream
application/msword
multipart/form-data
http ist Zustandslos –Anfragen sind nicht miteinander verbunden
Netzwerkprogrammierung
34
Konzepte des WWW

Web-Server was passiert wenn eine Webseite angefordert wird
Netzwerkprogrammierung
35
Konzepte des WWW

Fragen:
 Beim
öffnen einer typischen Webseite mit
Bilder, StyleSheets, JavaScripten
Wie viele http-Requests sendet der Browser
zum Server?
 Ist paralleles herunterladen beim öffnen einer
Webseite möglich/sinnvoll?
Netzwerkprogrammierung
36
Ausblick Übungsaufgabe 1


Entwickeln Sie einen minimalistischen
Webserver. Entscheiden Sie dabei selbst ob Ihr
Webserver mehrere Anfragen gleichzeitig
behandeln kann oder nicht. Konzentrieren Sie
sich beim parsen des http-Request Headers auf
die erste Zeile und implementieren Sie den
Befehl GET. Generieren Sie einen httpResponse Header, der von einem Browser
verstanden wird und auch der Seiteninhalt
(HTML Seite, Bilder) angezeigt wird.
Sie können in 2er Gruppen zusammenarbeiten.
Netzwerkprogrammierung
37
Socket Programmierung
Um die Übungsaufgabe Lösen zu könne,
benötigen wir Sockets.
 Server Entwickeln:

 Verwendung
von ServerSocket in Java.
Als Client nehmen wir zum Testen „telnet“
 Wie verwenden TCP als Transportprotokoll
Netzwerkprogrammierung
38
Socket Programmierung
import java.io.*;
import java.net.*;
public class _1_ServerSocket {
public static void main( String[] args ) {
ServerSocket server; // unser ServerSocket
try
{
server = new ServerSocket(1111); // maximal 65536
Socket client = server.accept(); // blockiert!
PrintWriter clientOut = new PrintWriter(new
BufferedOutputStream(client.getOutputStream()));
clientOut.println("Hallo Client...\nBye.");
clientOut.flush(); // damit Buffer übertragen wird!
client.close();
}
catch (IOException ex)
{
System.out.println(ex);
}
}
}
Netzwerkprogrammierung
39
Socket Programmierung

Test mit telnet:
Netzwerkprogrammierung
40
Socket Programmierung

Was kann unser Server:
 genau
eine Verbindung entgegennehmen
 einmalig eine Textnachricht an den Client senden
 Verbindung mit Client trennen
 Server wird beendet

Erweitern wir den Server mit:
 Server
arbeitet dauerhaft und kann beliebig viele
Verbindungen verarbeiten
 Client kann auch Daten zum Server senden
Netzwerkprogrammierung
41
Socket Programmierung
import java.io.*;
import java.net.*;
public class _2_ServerSocket {
public static void main(String[] args){
ServerSocket server;
try {
server = new ServerSocket(1111); // maximal 65536
while (true){ // wiederhole immer wieder!
Socket client = server.accept();
PrintWriter clientOut = new PrintWriter(new
BufferedOutputStream(client.getOutputStream()));
BufferedReader clientIn = new BufferedReader(new
InputStreamReader(client.getInputStream()));
clientOut.println("Hallo Client...\nBye.");
clientOut.flush();
String str = clientIn.readLine(); // empfangen
System.out.println(str); // auf Serverseite ausgeben
client.close();
}
}
catch (IOException ex){ System.out.println(ex); }
}
}
Netzwerkprogrammierung
42
Socket Programmierung

Was kann unser Server:
 Endlos
viele Verbindung entgegennehmen
 einmalig eine Textnachricht für den Client ausgeben
 einmalig eine Textnachricht empfangen
 Verbindung mit Client trennen

Was kann unser Server nicht:
Clients gleichzeitig – parallel – bedienen
  Clients müssen sich „anstellen“ in einer
Warteschlange
 mehrer
Netzwerkprogrammierung
43
Socket Programmierung

Multithreaded Server
 Wir
verwenden für jeden Client einen eigenen
Thread. Damit können diese quasi-parallel
abgearbeitet werden.
 Hinweis:

In der Praxis können sich mehrere 1000 Clients gleichzeitig
verbinden wollen  sehr viele Threads verlangsamen das
System (zu viel Verwaltung durch BS nötig).
Deshalb werden auch Thread-Pools eingesetzt
(z.B.: 100 feste Arbeitsthreads).
Netzwerkprogrammierung
44
Socket Programmierung
import java.io.*;
import java.net.*;
public class _3_MultiThreaded {
public class ClientThread extends Thread { // ein Thread
public Socket clientSocket = null;
public ClientThread(Socket s) { clientSocket = s; }
public void run() { // wird aufgerufen wenn Thread gestartet wird!
try {
PrintWriter clientOut = new PrintWriter(new
BufferedOutputStream(clientSocket.getOutputStream()));
BufferedReader clientIn = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
clientOut.println("Hallo Client...\nBye.");
clientOut.flush();
String str = clientIn.readLine();
System.out.println(str);
clientSocket.close();
}
catch (IOException ex) { System.out.println(ex);}
}
}
Netzwerkprogrammierung
45
Socket Programmierung
public void runServer() {
ServerSocket server;
try {
server = new ServerSocket(1111); // maximal 65536
while (true) {
Socket client = server.accept();
ClientThread ct = new ClientThread(client);
ct.start();
}
}
catch (IOException ex) { System.out.println(ex);}
}
public static void main(String[] args) {
System.out.println("*******************************************");
System.out.println("*>>>-----------------------------------<<<*");
System.out.println("*>>>
Multithreaded Server
<<<*");
System.out.println("*>>>-----------------------------------<<<*");
System.out.println("*******************************************");
_3_MultiThreaded prog = new _3_MultiThreaded();
prog.runServer();
}
}
Netzwerkprogrammierung
46
Socket Programmierung

Nun können wir mit mehreren Telnet Clients gleichzeitig testen:
Netzwerkprogrammierung
47
Socket Programmierung

Was kann unser Server:





beliebig viele Verbindungen parallel entgegennehmen
einmalig eine Textnachricht für den Client ausgeben
einmalig eine Textnachricht empfangen
Verbindung mit Client trennen
Fragen:


Kann man unseren Server über einen Webbrowser ansprechen
und wenn wie?
Wenn Ja, was würde im Webbrowser und im Server angezeigt
werden?
Netzwerkprogrammierung
48
Socket Programmierung
Netzwerkprogrammierung
49
Übungsaufgabe 1


Entwickeln Sie einen minimalistischen Webserver.
Entscheiden Sie dabei selbst ob Ihr Webserver mehrere
Anfragen gleichzeitig behandeln kann oder nicht.
Konzentrieren Sie sich beim parsen des http-Request
Headers auf die erste Zeile und implementieren Sie den
Befehl GET. Generieren Sie einen http-Response
Header, der von einem Browser verstanden wird und
auch der Seiteninhalt (HTML Seite, Bilder) angezeigt
wird.
Entwickeln Sie ihr Programm mit Java und verwenden
Sie die Klassen Socket und ServerSocket.
Nach eigenem Kenntnisstand können Sie eine
Konsolenanwendung oder Fensteranwendung erstellen.
Netzwerkprogrammierung
50
Übungsaufgabe 1

Hinweise:
 http-Response:
clientOut.println("HTTP/1.1 200 OK");
clientOut.println("Content-Type: text/html");
clientOut.println(""); // Header zuende - eine Leerzeile !!!
clientOut.println("<html><body><center>TEST</center></body></html>");
clientOut.flush();
 Verwenden
Sie Datei-Streams um Dateien (HTML,
Bilder) zu öffnen und deren Inhalt in clientOut zu
schreiben.
Netzwerkprogrammierung
51
Sprachvergleich mit C++
#include <windows.h>
#pragma comment( lib, "wsock32.lib")
bool IS_SERVER_RUNNING = true;
bool PROGRAM_IS_RUNNING = true;
unsigned short PORT = 1111; // Server Port
struct AClient {
SOCKET Socket; // Socket auf welchem wir arbeiten
HANDLE ThreadHandle; // der mit diesem Client verbundene Thread
};
DWORD WINAPI ClientThreadFunc( LPVOID ClientData ) {
AClient* Data = (AClient*)ClientData;
// Wir senden ein Hallo Welt an den Clienten //
char* Text = "Hallo Welt!\n";
send(Data->Socket,Text,strlen(Text),0);
// Beenden der Verbindung //
closesocket(Data->Socket);
delete Data;
return 0;
}
Netzwerkprogrammierung
52
Sprachvergleich mit C++
void CreateClient(SOCKET Sock) {
AClient* Data = new AClient[1]; unsigned long ID = 0; HANDLE Handle = 0;
Handle = CreateThread(NULL,0,ClientThreadFunc,(void*)Data,CREATE_SUSPENDED,&ID);
Data->ThreadHandle = Handle;
Data->Socket = Sock;
ResumeThread(Handle);
}
DWORD WINAPI ServerThreadFunc( LPVOID param ) {
sockaddr Addr;
SOCKET ServerSocket = 0;
SOCKET ActClient = 0;
ServerSocket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); // Socket erstellen //
memset(&Addr,0,sizeof(sockaddr)); // Adresse an die wir den Socket binden wollen festlegen //
Addr.sa_family = AF_INET;
unsigned short temp = htons(PORT);
memcpy(&Addr.sa_data[0],&temp,sizeof(unsigned short));
bind(ServerSocket,&Addr,sizeof(Addr)); // Binden des Sockets an die Adreese (Port) //
listen(ServerSocket,SOMAXCONN); // Socket auf listen schalten //
while(IS_SERVER_RUNNING){// Auf Clienten warten //
ActClient = accept(ServerSocket,NULL,NULL);
if(ActClient == INVALID_SOCKET) continue;
CreateClient(ActClient);
}
PROGRAM_IS_RUNNING = false; // Signal zum Beenden des gesamten Programms //
return 0;
}
Netzwerkprogrammierung
53
Sprachvergleich mit C++
int main () {
// Windows mitteilen das wir Sockets benutzen wollen //
WSADATA WsaData;
WSAStartup(0x101,&WsaData);
unsigned long ThreadID = 0;
HANDLE ThreadHandle = 0;
ThreadHandle =
CreateThread(NULL,0,ServerThreadFunc,NULL,CREATE_SUSPENDED,&ThreadID);
ResumeThread(ThreadHandle);
// Programm wartet bis Thread fertig ist //
// Hier könnte alles mögliche Andere verarbeitet werden //
while (PROGRAM_IS_RUNNING) Sleep(1);
// wieder aufräumen //
WSACleanup();
return 0;
}

 Ergebnis: Befehle sind sehr ähnlich, nur etwas mehr Schreibaufwand
und nicht Objektorientiert
Netzwerkprogrammierung
54
Socket Programmierung

Client Entwickeln
 bislang
haben wir fertige Clients verwendet
(telnet, Browser)
 Eigener Client verwendet einen Socket um
sich zum Server zu verbinden
 Lesen und Schreiben auf Socket genau wie
bereits im Server
Netzwerkprogrammierung
55
Socket Programmierung
public class _4_ClientSocket {
public class ClientThread extends Thread {
public void run() {
try {
Socket clientSocket = new Socket("127.0.0.1", 1111);
PrintWriter clientOut = new PrintWriter(new
BufferedOutputStream(clientSocket.getOutputStream()));
BufferedReader clientIn = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
String str = clientIn.readLine();
System.out.println(str);
clientOut.println("Hallo zurück");
clientOut.flush();
clientSocket.close();
} catch (IOException ex) { System.out.println(ex); }
}
}
public _4_ClientSocket() {
ClientThread ct = new ClientThread(); ct.start();
}
public static void main(String[] args){
_4_ClientSocket prog = new _4_ClientSocket();
}
}
56
Netzwerkprogrammierung
Socket Programmierung

Fragen:
 Bei
Consolenprogrammen ist für einen Client
kein Thread nötig. Bei einer GUI Anwendung
in der Regel jedoch schon – warum?
Netzwerkprogrammierung
57
Socket Programmierung
WGet Client
 Ziel: Ein Programm entwickeln, welches
HTML Daten von einem beliebigen
Webserver holt.
 Aufruf:
java wget www.google.de /index.html

Netzwerkprogrammierung
58
Socket Programmierung
import java.io.*;
import java.net.*;
public class _5_WGet {
public _5_WGet(String host,String file)
{
ClientThread ct = new ClientThread(host,file);
ct.start();
}
public static void main(String[] args)
{
if (args.length < 2)
{
System.out.println("Aufruf: java _5_wget www.host.de /file");
}
else
{
_5_WGet prog = new _5_WGet(args[0], args[1]);
}
}
Netzwerkprogrammierung
59
Socket Programmierung
public class ClientThread extends Thread {
public Socket clientSocket = null;
public String targethost;
public String targetfile;
public ClientThread(String host, String file){
targethost = host;
targetfile = file;
}
public void run() {
try {
clientSocket = new Socket(targethost, 80);
PrintWriter clientOut = new PrintWriter(new
BufferedOutputStream(clientSocket.getOutputStream()));
BufferedReader clientIn = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
clientOut.println("GET "+targetfile+" HTTP/1.1");
clientOut.println("Host:" + targethost+":80");
clientOut.println("");
clientOut.flush();
Netzwerkprogrammierung
60
Socket Programmierung
System.out.println("HTTP-Response-Header:");
String str = clientIn.readLine();
while (!str.equals("")) {
System.out.println(str);
str = clientIn.readLine();
}
System.out.println("");
System.out.println(„HTTP-Daten:");
str = clientIn.readLine();
while (!str.equals("")) {
System.out.println(str);
str = clientIn.readLine();
}
clientSocket.close();
}
catch (IOException ex){ System.out.println(ex);}
}
}
}
Netzwerkprogrammierung
61
Socket Programmierung
Netzwerkprogrammierung
62
Socket Programmierung

UDP
 verbindungslos
 „Broadcast“
möglich – senden an alle
Rechner in einem Netzwerk
Jeder Client entscheidet ob ihn das Paket
interessiert oder nicht
 Eine mögliche Lösung für „Chat-Anwendungen“

 Aber
zunächst einfache Client-ServerKommunikation 
Netzwerkprogrammierung
63
Socket Programmierung
public class _6_UDPServer {
public class ClientThread extends Thread {
public DatagramSocket clientSocket = null;
public void run() {
try {
clientSocket = new DatagramSocket(1234); // 1234=Port
while (true) {
// Ein Paket empfangen:
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
clientSocket.receive(packet);
String received = new String(packet.getData());
System.out.println("Empfangen: " + received);
// sender merken
InetAddress sender = packet.getAddress();
// Ein Paket senden:
packet.setAddress(sender);
received = "Dank zurück :)";
buf = received.getBytes();
packet.setData(buf);
clientSocket.send(packet);
}
}
Netzwerkprogrammierung
64
Socket Programmierung

Was kann unser Server:
 UDP
Datagramme annehmen auf Port 1234
 Dem Sender eine Nachricht zurücksenden
 Anfragen werden nicht parallel verarbeitet

Verwendet:
 DatagramSocket
und DatagramPacket
Netzwerkprogrammierung
65
Socket Programmierung

Fragen:
 Warum
bekommt nicht jeder eingehende
„Client“ einen eigenen Thread wie bei
unserem Multithread-TCP Server?
 Wann würde es Sinn machen Threads zu
verwenden?
Netzwerkprogrammierung
66
Socket Programmierung
public class _7_UDPClient {
public class ClientThread extends Thread {
public DatagramSocket clientSocket = null;
public String target;
public ClientThread(String Target) { target = Target; }
public void run() { try {
clientSocket = new DatagramSocket(); // ohne Port
byte[] buf = new byte[256];
String sendtext = "Hallo Server :)";
buf = sendtext.getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length);
InetAddress to = InetAddress.getByName(target);
packet.setPort(1234);
packet.setAddress(to);
clientSocket.send(packet);
clientSocket.receive(packet);
String received = new String(packet.getData());
System.out.println("Empfangen: " + received);
} catch (IOException ex) { System.out.println(ex); }
}
}
public _7_UDPClient(String Target) {
ClientThread ct = new ClientThread(Target); ct.start();
}
public static void main(String[] args) {
if (args.length < 1) { System.out.println("need Target IP as parameter");}
else { _7_UDPClient udp = new _7_UDPClient(args[0]); }
}
}
Netzwerkprogrammierung
67
Socket Programmierung
Netzwerkprogrammierung
68
Socket Programmierung

Verwendung von MulticastSocket
 An
alle Rechner in einem bestimmten Netzwerk
senden
 Einteilung in „multicast groups“ welche in Form einer
IP Adresse angegeben werden: 224.0.0.0 bis
239.255.255.255, dabei ist 224.0.0.0 reserviert und
sollte nicht verwendet werden.
 Ein Client kann sich einer Gruppe anschließen und
verlassen
 Vergleich: IP Adresse ~ Frequenz am Radio
Netzwerkprogrammierung
69
Socket Programmierung
Multicast Packet in eine Gruppe senden (2 Möglichkeiten):
String msg = "Hello";
String msg = "Hello";
InetAddress group =
InetAddress.getByName("228.5.6.7");
InetAddress group =
InetAddress.getByName("228.5.6.7");
MulticastSocket s = new
MulticastSocket(1234);
DatagramSocket s = new DatagramSocket ();
s.joinGroup(group);
DatagramPacket hi = new
DatagramPacket(msg.getBytes(),
msg.length(), group, 1234);
DatagramPacket hi = new
DatagramPacket(msg.getBytes(),
msg.length(), group, 1234);
s.send(hi);
s.send(hi);
Netzwerkprogrammierung
70
Socket Programmierung
Multicast Packet aus einer Gruppe empfangen:
InetAddress group = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket(1234);
s.joinGroup(group);
// Antwort empfangen
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length); // nur Buffer
s.receive(recv);
String received = new String(recv.getData(),0,recv.getLength());
System.out.println("Empfangen: " + received);
s.leaveGroup(group);
s.close();
Netzwerkprogrammierung
71
Socket Programmierung

Beide Clients empfangen zeitgleich das Paket
Netzwerkprogrammierung
72
Socket Programmierung

Fragen:
 Ein
Server möchte all seinen Clients eine
Nachricht senden. Besitzt ein UDP-Multicast
Vorteile gegenüber einer TCP Übertragung
oder einem adressierten UDP Paket?
 Nennen Sie Beispiel für UDP-Anwendungen,
wo eignet sich UDP besonders gut?
Netzwerkprogrammierung
73
Socket Programmierung

Zusammenfassung:
 Konzept
von Sockets / Ports kennen gelernt
 ServerSocket und Socket für Server und Client
Anwendungen verwendet
 Multithread-Server entwickelt
 HTTP Protokoll praktisch angewendet
 TCP und UDP verwendet
 Die verwendete Programmiersprache spielt dabei
eine untergeordnete Rolle
Netzwerkprogrammierung
74
Übungsaufgabe 2
Entwickeln Sie mit UDP MulticastSocket
eine Chat-Anwendung
 Verwenden Sie 2 Threads (einen für
Senden und einen für Empfangen)
 Gestalten Sie eine einfache GUI für die
Anwendung
 Es ist kein Chat-Server nötig

Netzwerkprogrammierung
75
Java Socket Programmierung

Objekte über das Netzwerk versenden
 Java
kann Objekte über einen
ObjectOutputStream schreiben (anwendbar
auf Dateien und Socketverbindungen)
 Objekte müssen java.io.Serializable
implementieren
 Vorteil: Kein „parsen“ von Textübertragungen
nötig, sondern ganze Objekte auf einmal
Netzwerkprogrammierung
76
Java Socket Programmierung

java.io.Serializable
 Serializable ist ein leeres Flag-Interface
 durch Implementierung wird eine Klasse serialisierbar
 standardmäßig werden alle Datenelemente, die nicht
als static oder transient delariert sind, serialisiert
 Das gleiche gilt für alle Klassen, die von einer Klasse,
die dieses Interface implementiert, abgeleitet sind.
 Serializieren kann man mit einem Foto des aktuellen
Zustands vergleichen
 Viele Klasse innerhalb von Java sind bereits
serialisierbar
Netzwerkprogrammierung
77
Java Socket Programmierung
public class Auto implements java.io.Serializable {
String Farbe;
int kmStand;
AutoTyp Typ;
}
public class AutoTyp implements java.io.Serializable {
String Hersteller;
String Typenschluessel;
}
Netzwerkprogrammierung
78
Java Socket Programmierung
Bisher:
Farbe
Server
Textzeile
KmStand
Textzeile
AutoTyp
Textzeile
Client
Zeilen auslesen
(parsen) und ein
Objekt erzeugen.
Jetzt:
Auto1
Server
Objekt
Auto2
Objekt
Auto3
Objekt
Netzwerkprogrammierung
Client
Fertige Objekte
kommen an.
79
Java Socket Programmierung
public class ServerSocket {
public static void main(String[] args){
ServerSocket server;
try {
server = new ServerSocket(1111); // maximal 65536
while (true){// wiederhole immer wieder!
Socket client = server.accept();
OutputStream out = client.getOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(out);
InputStream in = client.getInputStream();
ObjectInputStream objectIn = new ObjectInputStream(in);
Auto a1 = new Auto();
a1.Farbe = "blau"; a1.kmStand = 10000; a1.Typ = new AutoTyp();
a1.Typ.Hersteller = "XYZ";
objectOut.writeObject(a1); // schreiben eines Auto Objekts
objectOut.flush();
Auto a2 = (Auto)objectOut.readObject(); // empfangen eines Auto
System.out.println(a2.Farbe); // auf Serverseite Farbe ausgeben
client.close();
}
}
catch (IOException ex){ System.out.println(ex); }
}
}
80
Netzwerkprogrammierung
Java Socket Programmierung

Fragen:
 Welche
Nachteile hat dies gegenüber der
alten Variante mit Textzeilen?
 Was passiert wenn wir ein Objekt an den
Client senden, welches dieser nicht kennt
(keine Java-Klasse vorhanden)?
Netzwerkprogrammierung
81
Java Socket Programmierung

Klassen über das Netzwerk versenden
 Mit
Hilfe eines ClassLoaders können
Klassen dynamisch geladen werden
 Ein Interface beschreibt die Funktionsweise
der zu ladenden Klasse (damit der Client
weiß, wie sie sich verhalten wird)
 Klasse wird als ByteArray übertragen
(Byte Array selbst ist serialisierbar problemlos
per ObjectStream zu versenden  )
Netzwerkprogrammierung
82
Java Socket Programmierung
Der Class Loader ist dafür verantwortlich, alle
verschiedenen Teile eines Programmes (Java-Klassen)
zusammenzubringen, damit es ausführbar wird:
Class Loader
Bytecode
JVM
Internet
Netzwerkprogrammierung
83
Java Socket Programmierung
Aufgaben:
 Laden,Trennen und Verwalten von Klassen
Einteilung in sicher/unsicher
 Schutz der Java System-Klassen

Anmerkungen:
o Verhindern von Überschreibung vertrauenswürdiger JVM-Klassen
o
o
durch gleichnamige Klassen von einem Webserver
Erzeugung konkreter Klassen erst nach dem Verifikationsprozess
Zugriffsrechte auf Elemente innerhalb der Systemklassen-Packages
( java.* ) müssen geschützt werden (Sichtbarkeitsbeschränkungen)
 Eigene Klassen dürfen deshalb nicht diesen Packages hinzugefügt
werden.
Netzwerkprogrammierung
84
Java Socket Programmierung
 1 eingebauter Class Loader(Primordial Class Loader), der
für das Laden der System-Klassen verantwortlich ist
meist in C geschrieben
 volle Rechtevergabe an geladene Klassen

 es kann bel. viele zusätzliche Class Loader geben
 für
Web-Browser z.B. gibt es den Applet Class
Loader
 für jeden zusätzlichen ClassLoader kann es mehrere
Instanzen geben – eine pro Codebase
 damit:



eigene Namespaces
keine Namenskollisionen
keine Sichtbarkeit zwischen Namespaces
Netzwerkprogrammierung
85
Java Socket Programmierung
Class Loader Hierarchie:
Bei der Suche nach Klassen wird eine Class Loader-Hierarchie
durchlaufen:
direkte Kommunikation zwischen Class Loadern

Suchreihenfolge:
System-Klassen
lokale Klassen
Abgeleitete Class Loader(Java2):
Applikation
Remote-Klassen
Applet
Primordial Class Loader
java.lang.ClassLoader
java.security.SecureClassLoader
java.net.URLClassLoader
AppletClassLoader
System-Klassen
Netzwerkprogrammierung
86
Java Socket Programmierung
Der Class File Verifier prüft, ob das Programm nach den
Regeln der JVM läuft
 das bedeutet nicht unbedingt, dass das Programm
die Regeln von Java als Sprache befolgt
Class Loader
Regeln
Bytecode
JVM
Class File
Verifier
Class
Internet
Netzwerkprogrammierung
87
Java Socket Programmierung
Die 4 Phasen der Verifikation:
 Datei-Integrität überprüfen
• Format(0xCAFEBABE), Länge
 Klassen-Integrität überprüfen
• Superklasse(wenn vorhanden) nicht final
• Name und Signatur von Methoden und referenzierten Klassen
 Bytecode-Integrität überprüfen
• Datenfluß-Analyse
• Stack-Checking
• statische Typüberprüfung
 Laufzeit-Integrität überprüfen
• dynamische Typüberprüfungen
Netzwerkprogrammierung
88
Java Socket Programmierung
Interface
ICalculator
ClassClient
Interface beschreibt
wie die Calculator
Klasse arbeiten wird
ClassServer
Übertragung
Calculator
Netzwerkprogrammierung
89
Java Socket Programmierung
Interface
ICalculator
ClassClient
ClassServer
verwenden
Calculator
Calculator
(lokale Kopie)
Netzwerkprogrammierung
90
Java Socket Programmierung

Interface für Calculator:
public interface ICalculator {
public int add(int a, int b);
public int sub(int a, int b);
public long times(int a, int b)
public double div(double a, double b);
public double power(double basis, double exp);
}
Netzwerkprogrammierung
91
Java Socket Programmierung

Die Klasse Calculator:
public class Calculator implements java.io.Serializable, ICalculator {
public Calculator() { }
public int add(int a, int b)
{ return (a+b); }
public int sub(int a, int b)
{ return (a-b); }
public long times(int a, int b)
{ return (a*b); }
public double div(double a, double b) { return (a/b); }
public double power(double basis, double exp) {
return(Math.pow(basis, exp));
}
}
Netzwerkprogrammierung
92
Java Socket Programmierung

ClassServer:
 Stellt
Java-Klassen zur Verfügung
 Erwartet den Namen der zu übertragenden
Klasse
 Schickt dem Client die geforderte Klasse als
ByteArray zurück
Netzwerkprogrammierung
93
Java Socket Programmierung
public class ClassServer {
public void server() {
try {
ServerSocket ss = new ServerSocket(1234); // TCP Socket
while(true) {
System.out.println("Server at: " + ss.getLocalPort() + ".");
Socket s = ss.accept(); // Verbindung annehmen
OutputStream out = s.getOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(out);
InputStream in = s.getInputStream();
ObjectInputStream objectIn = new ObjectInputStream(in);
System.out.print("Connected...");
String name = (String)objectIn.readObject();
RandomAccessFile file =
new RandomAccessFile("classes/" + name + ".class", "r");
byte data[] = new byte[(int)file.length()];
file.readFully(data);
objectOut.writeObject(data);
objectOut.flush();
System.out.print("object transmitted...");
s.close();
}
} catch(Exception e) { e.printStackTrace(); }}
Netzwerkprogrammierung
94
Java Socket Programmierung

NetClassLoader:
 Erbt
von ClassLoader (eine fertige Java
Klasse)
 Implementiert findClass (String name)
 Stellt die Verbindung zum ClassServer her
und kommuniziert mit diesem
 ist der eigentliche Client unseres Programms
Netzwerkprogrammierung
95
Java Socket Programmierung
class NetClassLoader extends ClassLoader {
String host; int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData (String name) {
try {
Socket s = new Socket(host, port);
System.out.print("Connection established...");
InputStream in = s.getInputStream();
ObjectInputStream objectIn = new ObjectInputStream(in);
OutputStream out = s.getOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(out);
objectOut.writeObject(name); // Namen der Klasse die wollen
objectOut.flush();
Object o = objectIn.readObject(); // Klasse als Byte Array
System.out.print("object received...");
s.close();
System.out.println("connection closed.");
return (byte[]) o;
}
catch (Exception e) { return null; }}}
Netzwerkprogrammierung
96
Java Socket Programmierung

ClassClient
 Beispielanwendung
für NetClassLoader um
eine Klasse zu beziehen
 Verwendet anschließend die dynamisch
geladene Klasse
Netzwerkprogrammierung
97
Java Socket Programmierung
public class ClassClient {
private NetClassLoader classload = new NetClassLoader();
public Object getObject(String objectName) throws Exception{
classload.port = 1234;
classload.host = "localhost";
Class c = classload.findClass(objectName);
Object o = c.newInstance();
return o;
}
public void performTask() {
try {
// get an instance (object) out of the class
ICalculator calc = (ICalculator)getObject("Calculator");
System.out.println("6+7=" + calc.add(6, 7));
}
catch(Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
public static void main(String args[]) { new
ClassClient().performTask(); }
}
Netzwerkprogrammierung
98
Java Socket Programmierung

Fragen:
 Welche
Vorteile sehen Sie im dynamischen
Laden von Klassen?
 Welche Nachteile können entstehen wenn die
Bezugsquelle unbekannt ist?
Netzwerkprogrammierung
99
Java Socket Programmierung

Zusammenfassung:
 Java
Klassen über das Netzwerk dynamisch
übertragen
 ObjectInputStream und
ObjectOutputStream kennen gelernt
 Kann aber nicht mit „nicht Java“ Programmen
kombiniert werden
Netzwerkprogrammierung
100
Übungsaufgabe 3
Entwickeln Sie eine Java-Anwendung die
mit Hilfe von NetClassLoader eine
Arbeiterklasse von einem Server holt, eine
Instanz dieser Klasse abarbeitet und das
Arbeitsergebnis zum Server zurücksendet.
 Ziel: Verteilte Aufgabenverarbeitung – wie
zum Beispiel beim SETI Projekt

Netzwerkprogrammierung
101
Übungsaufgabe 3


Beispiel für eine Arbeiterklasse:
Durch das Sieb des Eratosthenes kann man schnell
Primzahlen finden:









Man füllt eine Liste mit Zahlen von 1 bis S (z.B. S=10000)
n sei eine Variable
man beginnt mit n=2 und sucht nun alle Vielfachen von n
alle gefundenen Vielfachen werden aus der Liste gestrichen
nun wird n auf die kleinste verbleibende Zahl gesetzt nach dem
letzten n (im ersten Fall n=3)
man sucht wieder alle Vielfachen von n und streicht dieser aus
der Liste
…
ist n*n >= S kann der Algorithmus beendet werden
Alle verbleibenden Zahlen in der Liste sind Primzahlen 
Netzwerkprogrammierung
102
RMI

RMI (Remote Methode Invocation)
 Java-Technologie
 Objekte
auf einem entfernten Rechner
werden verwendet wie lokale
 Eignet sich auch zur IPC (Inter-Process
Communication) von Anwendungen auf dem
selben Rechner
Netzwerkprogrammierung
103
RMI
Lokaler Rechner (Client)
Entfernter Rechner (Server)
SampleServer remoteObject;
int s;
…
s = remoteObject.sum (1,2);
1, 2
public int sum (int a, int b)
{
return a+b;
}
3
System.out.println(s);
Netzwerkprogrammierung
104
RMI
Client Host
Server Host
RMIClient1
Client – Side Java VM
Remote
Server
Object
Client Host
Server – Side Web Server
und Java VM
RMIClient2
Client – Side Java VM
Netzwerkprogrammierung
105
RMI
Wird vom
Entwickler
erstellt
Wird von
RMIC
erzeugt
Client.java
Server.java
verwendet
verwendet
IRMIServer.java
(Interface)
RMIServer.java
(Implementation)
Stubs
RMIServer.java
Skeletons
RMIServer.java
RemoteServerObject
Remote Reference Layer (RRL)
Wird von JVM
bereitgestellt und
verarbeitet
Transport Layer
(TCP)
Transport Layer
(TCP)
Netzwerkprogrammierung
106
Client.java
RMI
verwendet
IRMIServer.java
(Interface)
Lookup
(nachschauen)
Stubs
RMIServer.java
Aufruf
return
Skeletons
RMIServer.java
Server.java
verwendet
RMIServer.java
(Implementation)
Bind
(anmelden)
Netzwerkprogrammierung
RMI - Registry
RMI – Registry
kennt alle
Remote Server
Objekte und ist
Vermittler
(Telefonbuch)
107
RMI verwenden





1. Interface für RemoteObject Klasse definieren
2. Implementation des RemoteObjects
entsprechend des Interfaces
3. Server Programm, welches das
RemoteObject an die RMI-Registry bindet
4. Client Programm entwickeln, welches das
Interface verwendet und von der RMI-Registry
des Serverechners das RemoteObject holt
5. rmiregistry auf dem Server starten, rmic auf
die Serverklasse anwenden, Server starten
Netzwerkprogrammierung
108
RMI verwenden
Interface
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
Client
Server
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
private Client() {}
public static void main(String[] args) {
String host = (args.length < 1) ? null : args[0];
try {
Registry registry = LocateRegistry.getRegistry(host);
Hello stub = (Hello) registry.lookup("Hello");
String response = stub.sayHello();
System.out.println("response: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
public class Server implements Hello {
public Server() {}
public String sayHello() {
return "Hello, world!";
}
public static void main(String args[]) {
try {
Server obj = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
Netzwerkprogrammierung
109
RMI verwenden
Server:
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
Registry registry = LocateRegistry.getRegistry();
// Registry registry = LocateRegistry.createRegistry(7777);
registry.bind("Hello", stub);
// registry.rebind(“Hello", stub);
Client:
Registry registry = LocateRegistry.getRegistry("127.0.0.1");
Hello stub = (Hello) registry.lookup("Hello");
// Hello stub = (Hello )Naming.lookup("//hostname:port/Hello");
Netzwerkprogrammierung
110
RMI verwenden
Netzwerkprogrammierung
111
Beispiel: Internet Shopping




Ein Shopping Portal mit Java Programm
Das Beispiel wird mit Hilfe von zwei Server-Objekten
implementiert: Ein zentrales Server-Objekt, das
eingehende Verbindungen entgegennimmt und dafür
zuständig ist, neue Sitzungen zu erzeugen.
Ein Warenkorb-Objekt für die Clients.
Die Daten im Warenkorb werden von Client-Seite
hinzugefügt und auf dem Server im Warenkorb
zwischengespeichert.
Netzwerkprogrammierung
112
Beispiel: Internet Shopping


Zunächst Interfaces anlegen
Die Schnittstelle des zentralen Server-Objekts
hat dabei folgenden Aufbau:
import java.rmi.*;
public interface ShopServer extends Remote {
public Cart createCart() throws RemoteException;
}
Netzwerkprogrammierung
113
Beispiel: Internet Shopping

Der Client ruft die Methode createCart() und bekommt
ein Cart-Objekt zurück. Da der Inhalt des Warenkorbs
auf dem Server gespeichert werden soll, bekommt er
auch ein Interface:
import java.rmi.*;
public interface Cart extends Remote {
public void addProduct(String name) throws RemoteException;
public void removeProduct(String name) throws RemoteException;
public String[] listContents() throws RemoteException;
public void buy(String custID) throws RemoteException;
}
Netzwerkprogrammierung
114
Beispiel: Internet Shopping
Man kann dem Warenkorb neue Produkte
hinzufügen, Produkte entfernen, die
vorhandenen Produkte auflisten und die
Bestellung absenden.
 Zur Vereinfachung werden die Produkte
hier nur durch ihren Namen identifiziert.
(normalerweise eine eigene Klasse
Produkt)

Netzwerkprogrammierung
115
Beispiel: Internet Shopping



Das zentrale Server-Objekt ist in ShopServerImpl implementiert.
Besitzt eine main()-Methode, in der das Objekt beim Namensdienst
registriert wird.
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class ShopServerImpl extends UnicastRemoteObject
implements ShopServer {
public ShopServerImpl() throws RemoteException { }
public Cart createCart() throws RemoteException {
System.out.println("create cart"); return new CartImpl();
}
public static void main(String args[]) {
try { Naming.rebind("shop-server", new ShopServerImpl()); }
catch(Exception ex) { ex.printStackTrace(); } } }
Netzwerkprogrammierung
116
Beispiel: Internet Shopping



Beim Aufruf von createCart() wird ein neues
Cart-Objekt zurückgegeben.
Implementierung in CartImpl
Jeder User bekommt einen eigenen
Einkaufswagen
Netzwerkprogrammierung
117
Beispiel: Internet Shopping

import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.util.*;
public class CartImpl extends UnicastRemoteObject implements Cart {
List products;
boolean pending = false;
public CartImpl() throws RemoteException {
products = new ArrayList();
}
public void addProduct(String name) {
System.out.println("add product: "+name);
products.add(name);
}
Netzwerkprogrammierung
118
Beispiel: Internet Shopping
public void removeProduct(String name) {
System.out.println("remove product: "+name);
products.remove(name);
}
public String[] listContents() {
System.out.println("list contents");
String[] contents = new String[products.size()];
products.toArray(contents);
return contents;
}
public void buy(String custID) {
System.out.println("buy products: "+custID);
pending = false;
// Hier Bestellung verschicken ...
}
}
Netzwerkprogrammierung
119
Beispiel: Internet Shopping


Wenn eine Server-Methode ein Objekt
zurückgibt, das von UnicastRemoteObject erbt,
wird nicht das Objekt serialisiert sondern es wird
auf dem Server ein neues Remote-Objekt
erzeugt
 wenn der Client Methoden von Cart aufruft,
werden diese Methoden auf Serverseite
ausgeführt.
Netzwerkprogrammierung
120
Beispiel: Internet Shopping
import java.rmi.Naming;
public class ShopClient {
public static void main(String args[]) {
try {
ShopServer server = (ShopServer)Naming.lookup("ShopServer");
Cart cart = server.createCart();
cart.addProduct("Visual Studio 2005");
cart.addProduct("Oracle Database");
String[] s = cart.listContents();
for(int i=0; i < s.length; i++) System.out.println(" - "+s[i]);
cart.buy("Max Mustermann");
} catch(Exception ex) { ex.printStackTrace(); } }
}
Netzwerkprogrammierung
121
Beispiel: Internet Shopping

Fragen:
 Warum
bleibt der Einkaufskorb auf dem
Server?
 Wie sieht die typische Datenanbindung einer
solchen Anwendung aus?
Netzwerkprogrammierung
122
RMI verwenden

Vorteile gegenüber herkömmlicher
Socketprogrammierung:
 Minimale
(technische Netzwerk-) Kenntnisse
nötig
 Transparent – als Entwickler sehen wir die
gesamte Übertragung nicht (Abstraktion)
 Fernsteuerung eines Serverprogramms
anstatt reines Austauschen von Daten
Netzwerkprogrammierung
123
RMI verwenden

Nachteile:
 RMI-Registry
muss mitlaufen (eigener
Prozess mit eigenem Port)
 Die Datenübertragung erzeugt mehr
„Overhead“
 RMI ist nur mit der Programmiersprache Java
verwendbar
Netzwerkprogrammierung
124
RMI verwenden

Fragen:
 Man
kann bei mehreren Server Programmen
sowohl eine gemeinsame RMI-Registry
verwenden, als auch jeweils eine eigene.
Welche vorteile sehen Sie in beiden
Lösungen?
Netzwerkprogrammierung
125
RMI verwenden

Zusammenfassung:
 RMI
Architektur kennen gelernt
 RMI-Registry und RMIC verwendet
 Unterschied zwischen herkömmlicher
Socketprogrammierung und RMI aufgezeigt
Netzwerkprogrammierung
126
Übungsaufgabe 4


Ein kleines DBMS auf der Basis von RMI
Folgende Punkte soll der Server berücksichtigen:

Er implementiert einen ADT Person, mit den wichtigsten
Eigenschaften, wie







ID
Name
Vorname
Geburtsdatum
etc.
Weiterhin implementiert er einen Vector, welcher mit n vielen
Personen gefüllt ist. Der Vector soll den Namen personenVector
tragen.
personenVector soll serverseitig in eine binäre Datei serialisiert
werden. Verwenden Sie hierfür ObjectOutputStream bzw.
ObjectInputStream und java.io.Serializable.
Netzwerkprogrammierung
127
Übungsaufgabe 4

Er soll in einer Klasse DBServer, folgende
Methoden anbieten:






Person getPerson(int id)
Person[] getPersonByName(String name)
Person[] getPersonByVorname(String vorname)
void setPerson(Person p)
void removePerson(Person p)
Der Client soll sich ein Objekt vom Typ
DBServer verwenden und aus diesem
verschiedene Personen
aufrufen/setzen/löschen können.
Netzwerkprogrammierung
128
.NET Remoting

.NET bietet im wesentlichen zwei Konzepte für
Netzwerkprogrammierung:
 System.Runtime.Remoting


High Level Sprachelemente für RPC / Remote Objects
Wahlweise über BinaryTCP oder HTTP-SOAP (XML)
 System.Net.Sockets


Low Level Sprachelemente
Sockets wie wir schon mit Java hatten
Netzwerkprogrammierung
129
.NET Remoting
Ein Objekt wird vom Server für alle Clients
zur Verfügung gestellt
 Clients können das Objekt „fernsteuern“

 Direkt vergleichbar mit RMI
Netzwerkprogrammierung
130
.NET Remoting
Verwendung von 3 Projektmappen in VS
 1 Server Programm
 1 Client Programm
 1 gemeinsam genutzte
Klassen-Bibliothek

Netzwerkprogrammierung
131
.NET Remoting
public class MyServerObject :
MarshalByRefObject
{
private int Usercount;
public int GetUsercount() { return
Usercount; }
public void IncrementUsercount()
{
Usercount++;
System.Console.WriteLi ne("Us ercount
ist nun: " + Usercount);
}
public void DecrementUsercount()
{
Usercount--;
System.Console.WriteLi ne("Us ercount
ist nun: " + Usercount);
}
}
Alle Klassen müssen von
MarshalByRefObject
erben um RemoteObjekte
zu sein
Netzwerkprogrammierung
132
.NET Remoting
static void Main(string[] args)
{
HttpChannel channel = new
HttpChannel(8880); // Port
ChannelServices.RegisterChannel(channel,
false);
// Server über port 8880 ist hier offen
RemoteObjects.MySer verObject
server = new
RemoteObjects.MySer verObject();
RemotingServices.Marshal(ser ver,
"server");
System.Console.WriteLi ne("Ser ver
gestartet...");
System.Console.ReadLi ne(); // warte
auf Taste zum beenden
ChannelServices.UnregisterChannel(c hannel)
;
}
Bibliotheken einbinden
http Channel auf
Port 8880 öffnen
http Server wieder
schließen
Netzwerkprogrammierung
133
.NET Remoting
static void Main(string[] args)
{
RemoteObjects.MySer verObject
server = (RemoteObjects.MySer verObject)
Activator.GetObject
(typeof(RemoteObjects.M ySer verObject),
"http://127.0.0.1:8880/server") ;
// Zugriff auf das Server Objekt
server.IncrementUsercount();
System.Console.WriteLi ne("Du bist
der " + server.GetUsercount() + " User");
System.Console.ReadLi ne(); // warte
auf Taste zum beenden
server.DecrementUserc ount();
}
Arbeiten wie
lokales Objekt
Netzwerkprogrammierung
134
.NET Remoting
Netzwerkprogrammierung
135
.NET Remoting




Methoden werden auf dem Server ausgeführt
Über einen Channel können beliebig viele
Objekte registriert werden (ähnlich der RMIRegistry)
TcpChannel ist binär (weniger Overhead als
SOAP)
EventHandler für Kommunikation zwischen
Klassenbibliothek und Programmen
Netzwerkprogrammierung
136
.NET Remoting
wenn Handler
festgelegt wurde
dann ausführen
Netzwerkprogrammierung
137
.NET Remoting
Netzwerkprogrammierung
138
.NET Remoting

Vergleich .NET Remoting zu RMI
 Wenn
das SOAP Protokoll verwendet wird,
theoretisch auch mit Programmen anderer
Programmiersprachen koppelbar
 „RMI-Registry“ hier prinzipiell kein extra
Programm
 Bleibt vorwiegend auf Windows BS
beschränkt
Netzwerkprogrammierung
139
RMI und .NET Remoting
Beide Konzepte sind sehr ähnlich
 Beide haben den Nachteil:

 Der
Server kann selbständig keine
Nachrichten zum Client senden!
 Client stößt Methode auf Server an und
bekommt Ergebnis zurück
Netzwerkprogrammierung
140
RMI und .NET Remoting
RemoteObject wie
lokales behandeln
Server Host
Client Host
Anfrage
RMIClient1
Remote
Server
Object
Antwort
Server – Side Web Server
und Java VM
Client – Side Java VM
Netzwerkprogrammierung
141
RMI und .NET Remoting
Client Host
gedachtes
Ergebnis:
Remote
Server
Object
RMIClient1
Client – Side Java VM
Netzwerkprogrammierung
142
RMI und .NET Remoting

Der so genannte „Callback“:
 Server
kann zu einem beliebigen Zeitpunkt
den Client über Ereignisse informieren

Beispiel:
 Auktionshaus:
Alle Clients können Gebote abgeben
 Clients sollen stets das höchstgebot angezeigt
bekommen

Netzwerkprogrammierung
143
RMI und .NET Remoting
Client Host
Client Host
RMIClient1
RMIClient3
Teilt mit: Aktuelles
Gebot bei 10€
Sendet ein Gebot
Server Host
von 10€
Client – Side Java VM
Client – Side Java VM
Remote
Server
Object
Teilt mit: Aktuelles
Gebot bei 10€
Client Host
RMIClient2
Teilt mit: Aktuelles
Gebot bei 10€
Client Host
Server – Side Web Server
und Java VM
RMIClient4
Client – Side Java VM
Client – Side Java VM
Netzwerkprogrammierung
144
RMI und .NET Remoting

Realisierung von Callbacks:
 Client
wird selbst zu einem Server und stellt
RemoteObject bereit
 Client meldet sich am Server an (wie immer)
 Client teilt Server mit wie man ihn
„zurückrufen“ kann
 Server führt Liste über alle Clients
Netzwerkprogrammierung
145
RMI und .NET Remoting

Fragen:
 Welche
Nachteile ergeben sich durch den
Einsatz von Callbacks? (Bezug Firewalls,
NATs)
Netzwerkprogrammierung
146
Übungsaufgabe 5




Entwickeln Sie eine RMI oder .NET Remoting
Anwendung mit Callbacks
Auktionshaus mit n Teilnehmern und mehreren
Artikeln
Client sollte kleine GUI besitzen in der Gebote
abgegeben werden können und Artikel
angesehen/ausgewählt werden können
Prüfung ob ein abgegebenes Gebot > aktuelles
Höchstgebot ist
Netzwerkprogrammierung
147
Problem
In der realen Welt werden verschiedenste
Technologien zusammen verwendet
(Java, RMI, .NET …)
 Sockets arbeiten gut zusammen auch mit
unterschiedlichen System aber sind
schwer zu entwickeln (aufwendig).
  wir benötigen etwas unabhängiges und
leistungsstarkes

Netzwerkprogrammierung
148
WebServices
Eine Lösung: WebServices
 Jeder Betreiber stellt Services bereit
 Clients greifen auf diese zu

 Beispiel:
Google sucht für uns im Internet
 Verwenden von Google WebService um in
einem eigenen Projekten Google-Suche
anbieten zu könne.
Netzwerkprogrammierung
149
WebServices

Alternative zu RMI und .NET Remoting
 Plattformunabhängig
 Sprachunabhängig
(Perl,Java,C++,.NET,PHP,…)
 Beispiele: Google, Amazon, .NET Passport
 Auf HTTP (Web-Server) aufgesetzt, damit
kein zusätzlicher Port nötig, gut erreichbar
auch hinter Firewalls
 Webservices sind in der Regel „zustandslos“
Netzwerkprogrammierung
150
WebServices

Fragen:
 Welche
Vorteile bietet WebServer als Träger
noch?
 Kann es dadurch auch Nachteile/Probleme
geben?
Netzwerkprogrammierung
151
WebServices
Ziel:
Nachrichten zwischen Client und Server
können von allen Plattformen und
Programmiersprachen
gelesen/geschrieben werden!
 Vision:
Alle Server der Welt bieten Services an
und wie in einem Telefonbuch können die
Clients diese verwenden 

Netzwerkprogrammierung
152
WebServices
WebService
Consumer (Client)
WebService
Provider (Server)
Application
Logic
Application
Logic
WS-Toolkit
WS-Toolkit
DB
Message (SOAP)
Netzwerkprogrammierung
153
WebServices
WebService
Consumer (Client)
Application
Logic
WS-Toolkit
Beschreibt
WSDL
Liest
WebService
Provider (Server)
Application
Logic
DB
WS-Toolkit
Message (SOAP)
Transport HTTP
Netzwerk TCP/IP
Netzwerkprogrammierung
154
WebService

Woher weiß der Client wo ein Server steht
und welche WebServices er anbietet?
UDDI
Dienst
finden
Dienst
bekanntgeben
Client
Server
Netzwerkprogrammierung
155
WebService

Wie kann man nun die angebotenen
Dienste beschreiben?
public String[] doGoogleSearch (String s)
{
…
}
Wie soll dies ein Scheme
Program verstehen?
Netzwerkprogrammierung
156
WebService

WSDL
 XML-Sprache
zur Selbstbeschreibung von
WebServices

WSDL Beispiel:
 http://www.webservicex.net/globalweather.asmx?wsdl
 http://api.google.com/GoogleSearch.wsdl
 http://www.webservicex.net/CreditCard.asmx?wsdl

CreditCard WS - was halten Sie davon?
Netzwerkprogrammierung
157
WebService
Mit WSDL wird der Aufbau von Methoden
und deren Parametern beschrieben.
 Spezifische Angaben über Art, Menge …


Primitive Datentypen wie String, Integer,
Array … müssen vereinheitlicht werden !
Netzwerkprogrammierung
158
WebService
SOAP (Simple Object Access Protocol)
 XML basierte Sprache um Nachrichten
auszutauschen (Client  Server)
 SOAP wird in der Regel durch WS-Kit
erstellt und ausgewertet 
 Ursprünglich von MS Entwickelt für
XML-RPC  .NET Remoting kann SOAP

Netzwerkprogrammierung
159
WebServices

Google Suchanfrage stellen mit SOAP Nachricht:
<SOAP-ENV:Body>
<ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch"
SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<keyxsi:type="xsd:string">00000000000000000000000000000000</key>
<q xsi:type="xsd:string">das hier sind die Schlüsselworte</q>
<start xsi:type="xsd:int">0</start>
<maxResults xsi:type="xsd:int">10</maxResults>
<filter xsi:type="xsd:boolean">true</filter>
<restrict xsi:type="xsd:string" />
<safeSearch xsi:type="xsd:boolean">false</safeSearch>
<lr xsi:type="xsd:string" />
<ie xsi:type="xsd:string">latin1</ie>
<oe xsi:type="xsd:string">latin1</oe>
</ns1:doGoogleSearch>
</SOAP-ENV:Body>
Netzwerkprogrammierung
160
WebServices
Aus einer WSDL Datei kann man sich
automatisch eine Proxy-Klasse erzeugen
lassen (.NET, Java).
 Auch Internetseiten können automatisch
generiert werden (zum gerade
entwickelten WS)
 Beispiel mit .NET

Netzwerkprogrammierung
161
WebService

Selbst einen WS entwickeln und anbieten:
 Eine
eigene Klasse erbt von einer BasisWebservice Klasse
(System.Web.Services.WebService in .NET)
 Diese Klasse = WS Klasse die wir im Client
mit …WS w = new …WS(); instanziieren.
 Entwicklung von Methoden wie immer 
 Kennzeichnen der Methoden die von außen
verfügbar sein sollen ([WebMethod] in .NET)
Netzwerkprogrammierung
162
WebService
WebServices benötigen einen WebServer
(in der Regel)
 Damit eher ungeeignet für IPC (Inter
Process Communication)
 Entwicklung und Setup von WS ist ja nach
Sprache und BS leicht unterschiedlich

Netzwerkprogrammierung
163
WebServices

Nachteile:
 Großer Daten Overhead
 XML Parsen verbraucht Zeit
 Es gibt derzeit kein einheitliches
Modell zur
Authentifizierung eines Clients
 Beispiele: Google-Key oder .htaccess
(Beschränkung wie eine normale HTML Seite)
 Google
hat am 6.12.2006 seinen WebService wieder
eingestellt (es werden keine neuen Keys mehr
vergeben)
Netzwerkprogrammierung
164
WebServices

Fragen:
 Welche
Vorteile entstehen durch den Einsatz
von Webservices im Internet?
 Kann man Callbacks verwenden?
 Welche Probleme kommen besonders zum
tragen, wenn SOA (Service Oriented
Architecture) eingesetzt wird (viele
Webservices für unterschiedliche Aufgaben)?
Netzwerkprogrammierung
165
WebServices

Zusammenfassung:
 Sowohl
WebServices, RMI und .NET
Remoting besitzen einen sehr ähnlichen
Grundkonzept
 Mit steigender Abstraktion entsteht mehr
„Overhead“  langsamer, mehr
unerwünschte Datenübertragung
Netzwerkprogrammierung
166
Beleg - Projekte

Entwickeln Sie eine Client-Server Projekt
welches eines oder mehrere der
vorgestellten Konzepte (Sockets, RMI,
Remoting, WS,…) verwendet.
Netzwerkprogrammierung
167
Beleg – Projekte Ideen

Sockets:
 Email
Client alla Outlook (vereinfacht)
 FTP Client oder Server
 Chat Applet & Server
…

RMI / .NET Remoting
 Schach
Applikation
 Diverse Kartenspiele
…
Netzwerkprogrammierung
168
Beleg – Projekte Ideen

WS:
 Warenhaus
Artikelsuche
(mit DB und vielleicht Hibernate, …)
 Einheiten-Umwandler-Service
(€  $, m  cm…)
 Verschlüsslungsservice (Text  Crypted)
 ChartService (Wertliste  Chart-Grafik)
- Rückgabe ist ByteArray für JPEG Bild o.ä.
…
Netzwerkprogrammierung
169
Beleg – Projekte Ideen

Stellen Sie mir ihr Projekt vor (welchen
Inhalt soll es haben, wie wollen Sie es
umsetzen)
 Diskussion
Netzwerkprogrammierung
170
Java Applets
Java Programme die nur in einer
abgeschlossenen Laufzeitumgebung
arbeiten (z.B.:Web-Browser, Appletviewer)
 Ein Applet wird häufig in eine Website
eingebettet
 Programmcode wird aus dem Internet
geladen und auf dem lokalen Rechner
ausgeführt

Netzwerkprogrammierung
171
Java Applets





Sandbox-Prinzip
in Analogie zu einem Kind, das in seinem Sandkasten
keinen Schaden anrichten kann
Der Zugriff auf die Umgebung wird durch ein spezielles
Objekt, den Sicherheitsmanager, gesteuert
Der Sicherheitsmanager, wird bei der Initialisierung der
JVM festgelegt - Applet kann nichts ändern
Verboten:





Zugriffe auf das Dateisystem des lokalen Rechners
Zugriff auf Daten des Benutzers (Nutzername, Zwischenablage
etc.)
Netzwerkverbindungen zu anderen Rechnern als dem Server,
von dem das Applet geladen wurde
Starten von Programmen
Änderung der Sicherheitseinstellungen
Netzwerkprogrammierung
172
Java Applets

Applets besitzen keine „main“ Methode aber dafür:




init() - wird genau einmal aufgerufen, wenn das Applet erstmals
in den Browser geladen wird.
start() - wird jedes Mal aufgerufen, wenn das Applet sichtbar
wird.
stop() - wird jedes Mal aufgerufen, wenn das Applet verdeckt
wird, z. B. weil das Browser-Fenster von einem anderen Fenster
überdeckt wird. (klappt aber nicht immer so wie soll!)
destroy() - wird aufgerufen, wenn das Applet aus dem
Hauptspeicher entladen wird.
Netzwerkprogrammierung
173
Java Applets
Seite verlassen
Applet
erstellen
init ()
Seite
angezeigt
start ()
stop ()
Applet
vernichten
destroy ()
Zurück zur Seite
Blau = einmalig
Grün = kann mehrmals auftreten
Netzwerkprogrammierung
174
Java Applets

Wichtig: Applets werden in der Regel NIE
zerstört solange der betreffende Browser läuft!
 stop() verwenden um Resourcen freizugeben

Applets in HTML Seiten einbinden:
<applet code="Applet.class" width=300 height=400>
<param name="p1" value="param1">
</applet>
Netzwerkprogrammierung
175
Java Applets
SELFHTML Beispiel
Netzwerkprogrammierung
176
Java Applets
Applet kann neben „Grafikspielereinen“
aber auch „Frontend“ für eine echte
Anwendung sein
 Oft liegt Datenbank auf dem Server und
Kommunikation mit Applet ist notwendig
 RMI / Sockets können verwendet werden,
um Applet mit einer Server-Applikation zu
verbinden

Netzwerkprogrammierung
177
Java Applets

Hinweise zur Entwicklung von Applets:
IDE wie NetBeans eignet sich gut zur Entwicklung
 Appletviewer (als Testwerkzeug)
 Browser Cache bei Applets beachten!
 Internet Explorer
(Java-Konsole verwenden – „X“ für Cache leeren!)
 FireFox muss neu gestartet werden um Cache zu
leeren.

Netzwerkprogrammierung
178
Java Applets
import java.applet.*;
import java.awt.Graphics;
import java.awt.Font;
<APPLET
CODE="HalloApplet.class"
WIDTH="260" HEIGHT="40">
<PARAM name="Font"
value="Arial">
</APPLET>
public class HalloApplet extends Applet {
Font f;
public void init() {
String Schriftart = getParameter("Font");
f = new Font(Schriftart, Font.BOLD, 18);
System.out.println("Java-Konsole: init... !");
}
public void paint(Graphics g) {
g.setFont(f);
g.drawString("Hallo Welt!", 50, 25);
System.out.println("Java-Konsole: paint... !");
}
public void stop() {
System.out.println("Java-Konsole: stop... !");
}
}
Netzwerkprogrammierung
179
Java Applets

Applets in JAR Archiven verpacken
 Mehrere
Dateien können in ein Archive (wie
ZIP) verpackt werden
 Im Web muss dann nur eine Datei
heruntergeladen werden (wird auf dem Client
entpackt)
 JAR Archive können „signiert“ werden
Netzwerkprogrammierung
180
Java Applets

JAR Archive erzeugen
 jar
cvf AppletArchive.jar *.class
 Ein Archive erstellen und alle Class-Files im
aktuellen Ordner einbinden
 Es können aber auch alle anderen Dateien
(Bilder, HTML Dateien,…) eingebunden
werden
Netzwerkprogrammierung
181
Java Applets

Applet in Webseite mit Archive einbinden:
<APPLET
ARCHIVE="Archiv.jar"
CODE="HalloApplet.class"
WIDTH="260" HEIGHT="40">
<PARAM name="Font"
value="Arial">
</APPLET>
Netzwerkprogrammierung
182
Java Applets

Wichtige Informationen innerhalb des
Applets abrufen:
 String
p1 = getParameter ("param1");
liest einen Applet Parameter der über HTML
übergeben wurde ein
 java.net.URL db = getDocumentBase();
Gibt die URL des HTML Dokuments zurück in dem
das Applet eingebettet ist.
 Image whiteBoard = getImage (db, "White.jpg");
Ein Bild relativ zum HTML Dokument ins Applet laden
Netzwerkprogrammierung
183
Java Applets

Fragen:
 Macht
es Sinn, große Anwendungen in
Applets über den Browser zu verwenden?
(bezüglich Dateigröße, Aktualität der
Programmversion,…)
 Könnte unser NetClassLoader unter
Umständen Problemen entgegenwirken?
Netzwerkprogrammierung
184
Java Applets

Zusammenfassung:
 Die
meisten Java Anwendungen können mit
wenig Aufwand in Applets umstrukturiert
werden
 Inhalt der main() Methode dafür in die init()
 Signierte Applets bieten derzeit den größten
Leistungsumfang (mehr als Flash)
Netzwerkprogrammierung
185
Java Webstart
Technologie um Java-Anwendungen direkt
über das Internet zu installieren und
auszuführen.
 Kern ist das JNLP (Java Network
Launching Protocol) ~
„Intstallationsbeschreibungssprache“

Netzwerkprogrammierung
186
Java Webstart

Vorteile von Webstart:
 Keine
Konfiguration vom Anwender nötig
 Keine typische Installation mit
„Zielverzeichnis“, „Full, Medium, Small“ oder
ähnlichem
 Bei einer neuen Programmversion (auf dem
Server) wird beim nächsten Programmstart
(Anwender) automatisches Update
durchgeführt 
Netzwerkprogrammierung
187
Java Webstart

Unterschied zu Applets:
 Applet
wird im Browser ausgeführt
(WebStart Applikation wird heruntergeladen
und bleibt auf Anwender-PC)
 Browser ist nur zum Auffinden
Netzwerkprogrammierung
188
Java Webstart

Voraussetzungen (Server):
 Web-Server
(z.B.: Apache)
 MIME Type muss gesetzt sein
 Programm muss in JAR Dateien verpackt sein

Voraussetzungen (Client):
 Java
JRE muss installiert sein (1.3+)
 Internet Browser (IE, FireFox,…)
Netzwerkprogrammierung
189
Java Webstart
Schritt 1: Anwendung entwickeln
 Schritt 2: In JAR Datei Verpacken
 Schritt 3: MIME Type im WebServer setzen
 Schritt 4: JAR Dateien in HTDOCS
(Web-Root) kopieren
 Schritt 5: JNLP Datei anlegen (XML)

Netzwerkprogrammierung
190
Java Webstart

Aufruf aus einer HTML Seite über:
<a href="webstart.jnlp" >Anwendung Starten</a>

Sandbox:
 Auch
WebStart Applikationen laufen im
Sandboxmodus – mit signed JARs auch volle
Rechte möglich
Netzwerkprogrammierung
191
Java Webstart

Beispiel mit NetBeans und Apache:
 Einfache
Fensteranwendung
 NetBeans anweisen eine JAR Datei für das
Projekt anzulegen
 Apache Server konfigurieren:

Apache/conf/mime.types editieren
application/x-java-jnlp-file
jnlp
 einfügen
 JNLP
Datei erstellen und mit JARs zusammen
in einen Ordner legen im Apache HTDOCS.
Netzwerkprogrammierung
192
Java Webstart
JNLP Datei Beispiel:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+“ codebase="http://127.0.0.1/dist" href="webstart.jnlp">
<information>
<title>Demo</title>
<vendor>Wir</vendor>
<description>Unser Demo Programm</description>
<homepage href="http://www.hs-zigr.de"/>
<offline-allowed/>
<shortcut online="false">
<desktop/>
<menu submenu="Superdemos"/>
</shortcut>
</information>
…
Netzwerkprogrammierung
193
Java Webstart
JNLP Datei Beispiel:
…
<resources>
<jar href="WebStart.jar"/>
<jar href="lib/swing-layout-1.0.jar"/>
<j2se version="1.4+" href="http://java.sun.com/products/autodl/j2se" />
</resources>
<application-desc main-class="webstart.Form"/>
</jnlp>
Netzwerkprogrammierung
194
Java Webstart

JNLP API
 Funktionen
für OpenDialog, SaveDialog,
PrintDialog,… auch in nicht signierten JAR‘s
 Wenn nur diese Funktionalität benötigt wird
deutlich sicherer als signiertes JAR
 Benötigt jnlp.jar als Bibliothek (API Referenz)
Netzwerkprogrammierung
195
Übungsaufgabe 6





Verwenden Sie das DBMS aus Übung 4 und entwickeln
Sie ein Java-Applet als Client
Der Server bleibt dabei unverändert
Verwenden Sie das nachfolgende Tutorials um ihr JavaApplet in ein JAR zu verpacken und selbst zu signieren:
http://www-personal.umich.edu/~lsiden/tutorials/signedapplet/signed-applet.html
http://java.sun.com/developer/technicalArticles/Security/
Signed/
Netzwerkprogrammierung
196
.NET im Browser





Früher ActiveX heute .NET
Ermöglicht es genau wie bei Applets
Anwendungen über Browser auszuführen
Sandbox-Modus wie bei Applets
Keine besondere „Appletklasse“ von der
abgeleitet werden muss
 läuft nur im Internet Explorer und nur
bei installiertem .NET Framework
Netzwerkprogrammierung
197
.NET im Browser
Netzwerkprogrammierung
198
.NET im Browser
Netzwerkprogrammierung
199
.NET im Browser


VS erzeugt eine DLL bei Kompilation
Einbinden in HTML Seite über:
<html>
<body>
<object id="simpleControl1"
classid="http:./Control1.dll#Control1.UserControl1“
height="338" width="744" VIEWASTEXT>
</object>
</body>
</html>
Netzwerkprogrammierung
200
.NET im Browser
Einbindung funktioniert leider nicht lokal 
 DLL muss auf einen Webserver gelegt
werden
 Vorzugsweise IIS, Apache kann auch
dazu konfiguriert werden
 http://84.16.228.218/applet/run.html
http://84.16.228.218/applet/cards.html

Netzwerkprogrammierung
201
.NET im Browser

Zusammenfassung:
 Konzept
nahezu identisch mit Java-Applets
 Nicht plattformunabhängig (eventuell mit
Mono unter Linux)
 Sprachunabhängig, sowohl J#, C#, VB#
eignen sich zur Entwicklung
Netzwerkprogrammierung
202
Serverseitige Programmierung


Applets und .NET Browserprogramme werden
auf dem Client ausgeführt
Bestimmte Aufgaben kann der Client jedoch
alleine nicht lösen (Datenbank, dynamische
Generierung von Dokumenten, …)
 Wenn
nur wenige Daten vom Server benötigt werden,
dann Applet sinnvoll
 Wenn sehr viele Daten vom Server verarbeitet
werden müssen, dann lieber gleich serverseitige
Anwendung verwenden und „thin-Client“
Netzwerkprogrammierung
203
Serverseitige Programmierung

Der Server
 Keine
zusammenhängende Abarbeitung
 Requests müssten zugeordnet werden
 Speicherobjekte gehen ohne explizite
Sicherung nach jedem Response verloren
 Vor jeder Requestverarbeitung müssen
vorangehende Speicherobjekte
wiederhergestellt werden
Java Servlets




Das Java Konzept für dynamische
Webseitengenerierung auf Serverseite
Servlet = Java Klasse in einem J2EE Webserver
Servlet-Container (z.B.: Tomcat) läuft.
Ein Servlet ist prinzipiell vergleichbar mit einem
WebService nur ohne SOAP
Methoden doGet(…) und doPost(…) werden
aufgerufen wenn eine Anforderung eintrifft
Netzwerkprogrammierung
205
Quelle: Wikipedia
Netzwerkprogrammierung
206
Rückblick auf HTTP und
Webserver mit Sockets

Request Header
 Welche
Datei soll vom Server abgerufen werden
 Cookies im Header
 Browsertyp …

Response Header
 Status
Code (200,404,403…)
 Content-Type (text/html, image/jpeg,…)
 Daten (HTML Seite, Bild…)
Netzwerkprogrammierung
207
2
Web-Server
(www.google.de)
3
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-excel, application/
vnd.ms-powerpoint, application/msword, application/x-icq, */*
Accept-Language: de
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET
CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 127.0.0.1:81
Connection: Keep-Alive
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html
Set-Cookie:
PREF=ID=5d5b86a54ea78fff:TM=1172152002:LM=1172152002:S=yRZ
ldpnO3qqV9
FoT; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/;
domain=.google.com
Server: GWS/2.1
Transfer-Encoding: chunked
Date: Thu, 22 Feb 2007 13:46:42 GMT
1
4
Client
<html><head><meta http-equiv="content-type" content="text/html;
charset=ISO-8859
-1"><title>Google</title><style><!-body,td,a,p,.h{font-family:arial,sans-serif}
.h{font-size:20px}
.h{color:#3366cc}
.q{color:#00c}
--></style>
<script>
<!-function sf(){document.f.q.focus();} ……………
Netzwerkprogrammierung
208
Java Servlet Beispiel
public class NewServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { processRequest(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { processRequest(request, response); }
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Servlet NewServlet</title></head>");
out.println("<body>");
out.println("<h1>Servlet NewServlet at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
Netzwerkprogrammierung
209
Java Servlet Beispiel
public class ImageCreator extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
// JPEG Bild erzeugen
BufferedImage bi = new BufferedImage(300, 150, BufferedImage.TYPE_INT_RGB);
Graphics2D big = bi.createGraphics();
big.drawString("Generarted Image",10,20);
big.drawString((new Date()).toString(),10,50);
ByteArrayOutputStream o = new ByteArrayOutputStream();
try {
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(o);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(bi);
} catch (Exception ex) { ex.printStackTrace(); }
out.write(o.toByteArray());
out.close();
}
Netzwerkprogrammierung
210
Java Server Pages
Einige Servlets erzeugen pure HTML
Ausgabe und haben nur kleine Code
Elemente eingebettet.
 Hierfür eignet sich JSP (Java Server
Page)

Netzwerkprogrammierung
211
Java Server Pages

Arbeitsweise für den Entwickler wie PHP
 Programmcode
wird in eine HTML Seite eingebettet
(Endung .jsp)
 <title>
<% int v1 = 0;
out.println("Der Wert der Variable: " + v1);
%>
</title>
 JSP wird im Hintergrund in ein Servlet übersetzt
welches mit println() die HTML Teile ausgibt.
Netzwerkprogrammierung
212
Servlet / JSP Entwicklung mit NetBeans
Netzwerkprogrammierung
213
Servlet / JSP Entwicklung mit NetBeans
Netzwerkprogrammierung
214
Servlet / JSP Entwicklung mit NetBeans
Netzwerkprogrammierung
215
Servlet / JSP Entwicklung mit NetBeans

Bei Ausführung startet ein Browser:
Netzwerkprogrammierung
216
Servlet / JSP Entwicklung mit NetBeans
Netzwerkprogrammierung
217
Servlet / JSP Entwicklung mit NetBeans
Netzwerkprogrammierung
218
Servlet / JSP Entwicklung mit NetBeans
Netzwerkprogrammierung
219
Servlet / JSP Entwicklung mit NetBeans
Netzwerkprogrammierung
220
Servlet / JSP Entwicklung mit NetBeans

Fragen:
 Welche
Vorteile besitzt eine serverseitige Lösung
gegenüber einer clientseitigen, bezüglich der
Datensicherheit?
(z.B.: Applet verbindet sich direkt mit Datenbank auf
dem Server)
 Welche Anforderungen haben serverseitige Lösungen
an den Client?
 Welchen Nachteile haben serverseitige Programme?
Netzwerkprogrammierung
221
Servlet / JSP Sessionmanagement
wie WebServices sind Servlets von Haus
aus „zustandslos“
 In Webapplikationen ist es aber fast immer
nötig zu wissen, welcher Client gerade
eine Anfrage sendet (zum Beispiel
Internet-Shopping)
 Session-Management nötig !

Netzwerkprogrammierung
222
Servlet / JSP Sessionmanagement
public class LoginServlet extends HttpServlet {
protected void processRequest(…) throws … {
String user = request.getParameter("user");
String pass = request.getParameter("pass");
// Passwort & Benutzernamen überprüfen würde hier passieren
HttpSession s = request.getSession(true);
s.setAttribute("username",user);
response.sendRedirect("index.jsp");
}
Netzwerkprogrammierung
223
Übungsaufgabe 7

Verwenden Sie NetBeans IDE und erstellen Sie
eine dynamische Webseite mit JSP
 Dabei
soll auch ein Formular vorhanden sein
(mit Eingabefeldern)

Erstellen Sie ein Servlet, welches die
Eingegebenen Werte des Formulars verarbeitet
 Servlet
soll ein Ergebnis seiner Verarbeitung
zurückliefern

Hinweis: Sie benötigen im Servlet:
request.getParameter("EingabefeldName");
Netzwerkprogrammierung
224
Übungsaufgabe 7

Ein Beispiel:
Netzwerkprogrammierung
225
ASP .NET




.NET Variante von Java Servlets/JSP
Teilung von HTML (ASP Seite) und Quelltext
(Code-Behind) in einer .NET Sprache wie C#
Seitenelemente sind Objekte (Textfelder,
Buttons,…) – keine einfachen HTML Elemente
mehr
Java hat dieses Konzept wieder kopiert und
nennt es „Java Server Faces“ Framework
Netzwerkprogrammierung
226
ASP .NET



Request und Response Objekte genau wie in
Java
Sessionkonzept ist nahezu identisch umgesetzt
wie in Java
Vorteile von .NET wie
 Schnelles
einbinden von WebServices
 XML DOM
…

Nachteile
 Nur
IIS (Windows WebServer)
Netzwerkprogrammierung
227
ASP .NET - Beispiel
Login Seite
 geschützte Seite die Login erfordert

Netzwerkprogrammierung
228
Zusammenfassung




Auch auf Serverseite sind die Konzepte zwischen Java
und .NET sehr ähnlich.
In der Realität werden alle besprochenen Technologien
sehr heterogen eingesetzt.
Webapplikationen bieten viel Potential doch auch
herkömmliche Client/Server Anwendungen werden
relevant bleiben.
Aber auch „low-Level“ Netzwerkprogrammierung bleibt
wichtig!
 Sie sollten mit allen Technologien vertraut sein 
Netzwerkprogrammierung
229
Herunterladen