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