Upload
doanphuc
View
221
Download
0
Embed Size (px)
Citation preview
Praktikum aus Softwareentwicklung 2
Netzwerkprogrammierung & Threads
Praktikum aus Softwareentwicklung 2
1Java Praktikum – SS 2008 – [email protected]
Praktikum aus Softwareentwicklung 2
Praktikum aus Softwareentwicklung 2
Netzwerkprogrammierung& Threads
• Netzwerkprogrammierung
–URL, URLConnection, UDP, TCP
• Threads
2Java Praktikum – SS 2008 – [email protected]
• Threads
–Parallele Programme, Synchronisation, …
Praktikum aus Softwareentwicklung 2
Host ComputerHost Computer
NetzwerkprogrammierungGrundlagen (1/2)
• Kommunikation zwischen verteilten Programmen
3Java Praktikum – SS 2008 – [email protected]
Java Virtuelle Maschine
Java Virtuelle Maschine
Netzwerk
Java Virtuelle Maschine
JVM, Web Server, Datenbank, Ftp..
Netzwerk-Betriebssystem Netzwerk-Betriebssystem
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungGrundlagen (2/2)
• ISO OSI, IP und Java - http://www.ethereal.com/
Application
OSI 7 Schichten Internet
URL etc.
java.net
4Java Praktikum – SS 2008 – [email protected]
Application
Presentation
Session
Transport
Network
Data Link
Physical
http, ftp, telnet, ...
TCP, UDP
Internet Protocol
Ethernet, Token Ring, FDDI, ..
URL etc.
Streams
Socket…
InetAddress
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungHTTP und URLs
• Hypertext Transfer Protocol (HTTP/1.1)• Uniform Resource Locator
protocol :// [user@] host [:port] /filepath [ref]
– RFC2396… http://www.rfc-editor.org/
5Java Praktikum – SS 2008 – [email protected]
– RFC2396… http://www.rfc-editor.org/ http://www.w3.org/Addressing/URL/url-spec.html
• Beispiele:– http://www.somewhere.com:80/remoteSurvey.html
– https://secure.tiscover.com:443
– ftp://www.nowhere.net/
– file://D:/tmp/bsp.html
– mailto://[email protected]
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungVerwendung von URLs
• Ein Objekt der Klasse java.net.URL repräsentiert eine Ressource im Internettry {
URL u = new URL("http://java.sun.com/index.html");
6Java Praktikum – SS 2008 – [email protected]
} catch(MalformedURLException e) { … }
// URL(String protocol, String host, int port, String file)
• Parsen:u.getProtocol();
u.getHost(); // ... (File, Port, Ref)
• Direktes Lesen von einer URL:InputStream in = u.openStream();
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungURLConnection
• Verbindung wird durch ein URLConnection Objekt repräsentiert und bei dessen Instanziierung aufgebaut. Generell ist das Erzeugen einer Connection zu einem Url ein mehrstufiger Prozess.URLConnection uc = u.openConnection();u.connect();
7Java Praktikum – SS 2008 – [email protected]
u.connect();
• Datenaustausch erfolgt über Streams der URLConnectionInputStream ui = uc.getInputStream();OutputStream uo = uc.getOutputStream();
• HttpURLConnectionHttpURLConnection http_uc = (HttpURLConnection)uc;uc.getRequestMethod();uc.getResponseMessage();
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungBeispiel: "mailto:"
import java.io.*;
import java.net.*;
...
System.setProperty("mail.host", „smtp.tiscover.com");
8Java Praktikum – SS 2008 – [email protected]
System.setProperty("mail.host", „smtp.tiscover.com");
URL u = new URL("mailto:[email protected]");
URLConnection conn = u.openConnection();
PrintWriter out = new PrintWriter(
new OutputStreamWriter(conn.getOutputStream()));
out.println("Subject: Test");
out.println();
out.println("Hello World!");
out.close();
...
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungTCP/IP, UDP
• Internet Protocol (IP)– Routing der IP-Pakete (versehen mit Empfänger, Sender)
• Transport Control Protocol (TCP)– Verbindung über gemeinsamen Kommunikationskanal– Stückelt Nachricht in mehrere durchnummerierte Pakete
9Java Praktikum – SS 2008 – [email protected]
– Stückelt Nachricht in mehrere durchnummerierte Pakete– Überprüft ob Paket Ziel erreicht hat, ansonsten Wiederholung– Empfänger setzt Pakete in richtiger Reihenfolge wieder zusammen
• Uniform Datagram Protocol (UDP)– Keine ständige Verbindung - zustandslos– Jedes Paket wird einzeln gesendet– Paket kann verloren gehen, keine Kontrolle– Multicast ist möglich
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungSockets
• Sockets sind die Schnittstelle zwischen Anwendung und Netzwerkverbindung
• Host:Port zur Identifizierung der Anwendungen
10Java Praktikum – SS 2008 – [email protected]
• Die "Server"-Anwendung wartet auf einem vereinbarten Port auf Verbindungsaufnahmen durch Client-Anwendungen
Host 1169.254.235.246
809951Client Http-
Server
UDP: Pakete
TCP: Stream
Host 2169.254.235.247
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungUDP – paketorientiert
• Datenaustausch basiert auf Paketen (Datagramme)• DatagramPacket repräsentiert Datenpaket
– Paket zum Senden:DatagramPacket(byte[] buf, int length,
11Java Praktikum – SS 2008 – [email protected]
DatagramPacket(byte[] buf, int length,
<Host>, <Port>)
– Paket zum Empfangen:DatagramPacket(byte[] b, int len)
• DatagramSocket zum Senden und Empfangenpublic void send(DatagramPacket d);
public void receive(DatagramPacket d);
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungUDP – Senden/Empfangen
• InitialisierungDatagramSocket socket = new DatagramSocket(9998);
• Request schickenInetAddress address =
12Java Praktikum – SS 2008 – [email protected]
InetAddress address =
InetAddress.getByName("host");
DatagramPacket packet =
new DatagramPacket(buf, buf.length, address, 8889);
socket.send(packet);
• Response empfangenpacket = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData());
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungTCP – verbindungsorientiert
• Kommunikation erfolgt bidirektional über Sockets• Socket := (Host, Portnummer)• Implementierung des Datenaustausches mit Streams• Client stellt Verbindung her durch Instanziierung
13Java Praktikum – SS 2008 – [email protected]
• Client stellt Verbindung her durch Instanziierung eines Socket Objektes
• Server ist implementiert durch ServerSocket undwartet auf einer bestimmten Portnummer auf Anfragen:
public Socket accept();
• Verbindungsabbruch durch Schließen des Sockets
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungVerbindungsaufbau
• ClientSocket s = new Socket(<Host>,<Port>);
InputStream si = s.getInputStream();
OutputStream so = s.getOutputStream();
14Java Praktikum – SS 2008 – [email protected]
OutputStream so = s.getOutputStream();
• Server (gestartet auf <Host>)ServerSocket ss = new ServerSocket(<Port>);
Socket s = ss.accept(); // blockierend
InputStream from_so = s.getInputStream();
OutputStream to_si = s.getOutputStream();
• Das Socket Objekt repräsentiert die Verbindung
Praktikum aus Softwareentwicklung 2
NetzwerkprogrammierungDatenaustausch
• Lesen vom InputStream, schreiben auf den OutputStream
• Protokoll muss vereinbart werden
– Kodierung der Daten
– Koordination der Aktivitäten (Kontrollfluss)
15Java Praktikum – SS 2008 – [email protected]
– Koordination der Aktivitäten (Kontrollfluss)
• Beispiel: Simple Mail Transfer Protocol (RFC-821)
– Zeilenweiser Austausch von Kommandos und Statusantwort
– Client sendet Kommando an den SMTP-Server(z.B. "MAIL FROM:<[email protected]>\r\n")
– Server antwortet mit Status-Code(z.B. "250 OK\r\n")
Praktikum aus Softwareentwicklung 2
Netzwerkprogrammierung& Threads
• Netzwerkprogrammierung
–URL, URLConnection, UDP, TCP
• Threads
16Java Praktikum – SS 2008 – [email protected]
• Threads
–Parallele Programme, Synchronisation, …
Praktikum aus Softwareentwicklung 2
ThreadsEigenschaften
• "Heavy-weight" Prozess– Adressraum– Ausführungszustand – Programmzähler, Ausführungs-Stack– eventuell mehrere Threads
17Java Praktikum – SS 2008 – [email protected]
– eventuell mehrere Threads
• "Light-weight" Prozess (Thread)– teilt sich den Adressraum mit seinem Parent und anderen Threads– jeder Thread ist ein eigener, sequentieller Kontrollfluss mit einem
eigenen Programmzähler, Ausführungs-Stack und Zustand– User-Thread– Daemon-Thread: terminieren automatisch, wenn der letzte
nicht-Daemon Thread beendet wird
• Paralleler Ablauf des Parent-Prozesses und aller Threads
Praktikum aus Softwareentwicklung 2
ThreadsImplementierung von Threads
• Ableiten von der Klasse java.lang.Thread und Überschreiben der Methode run
• Implementierung des Interfaces Runnable und Übergabe des Objekts an ein Thread Objekt im
18Java Praktikum – SS 2008 – [email protected]
• Implementierung des Interfaces Runnable und Übergabe des Objekts an ein Thread Objekt im Konstruktor
class Clock implements Runnable {public void run() { ... }
}…Clock clk = new Clock();Thread clkThread = new Thread(clk).start();
Praktikum aus Softwareentwicklung 2
ThreadsBeispiel: SimpleThread
Threadvoid run()
void start()
Runnable Leer-Implement
ierung VM erzeugt OS-Thread und ruft run() auf
19Java Praktikum – SS 2008 – [email protected]
void start()
SimpleThreadpublic class ThreeThreadsTest {
public static void main (String[]
args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
new SimpleThread(„Bora").start();
}
}
void run()
Haupt-programm von SimpleThread
run() auf
Praktikum aus Softwareentwicklung 2
ThreadsLebenszyklus
Alive
yieldwait
sleep
20Java Praktikum – SS 2008 – [email protected]
Created
new
start[sleeptime is
over]
interrupt
notify[All]
sleep
Running Suspended
Stopped
Praktikum aus Softwareentwicklung 2
ThreadsSimpleThread Sequenzdiagramm
ThreeThreadsTest:Class
jamaica:SimpleThread
mainnew
21Java Praktikum – SS 2008 – [email protected]
fiji:SimpleThread
startrun
new
startrun
Praktikum aus Softwareentwicklung 2
ThreadsThread, Runnable und Object
Thread
Thread (name: String)
Object<<interface>>
Runnable
run()
<<realizes>>notify ()
notifyAll ()
wait ()
22Java Praktikum – SS 2008 – [email protected]
Thread (name: String)
Thread (r: Runnable)
start ()
run ()
sleep (millis:long)
yield ()
interrupt ()
isInterrupted ()
join ()
isDaemon ()
setDaemon ()
...
wait ()
...
Praktikum aus Softwareentwicklung 2
ThreadsBeispiel: Time Server
public class TimeServer {
public static void main (String args[])
throws IOException {
ServerSocket server = new ServerSocket(1234);
while (true) {
23Java Praktikum – SS 2008 – [email protected]
while (true) {
System.out.println("Waiting for client...");
Socket client = server.accept();
System.out.println("Client from" +
client.getInetAddress() + "connected.");
TimeHandler handler = new TimeHandler(client);
new Thread(handler).start();
}
}
}
Praktikum aus Softwareentwicklung 2
ThreadsBeispiel: Time Handler
public class TimeHandler implements Runnable {private Socket client;public TimeHandler(Socket _client) { client = _client; }public void run () {try {
DataOutputStream out = new DataOutputStream(
24Java Praktikum – SS 2008 – [email protected]
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
Date date = new Date();System.out.println(date.toString());out.writeUTF(date.toString());out.flush();client.close();
} catch (IOException e) { System.err.println(e); }}
}
Praktikum aus Softwareentwicklung 2
ThreadsPrioritäten
• Jeder Thread hat bestimmte Prioritätpublic final static int MAX_PRIORITY = 10;
public final static int NORM_PRIORITY = 5;
public final static int MIN_PRIORITY = 1;
• Priorität kann selbst definiert werden:
25Java Praktikum – SS 2008 – [email protected]
• Priorität kann selbst definiert werden:public final void setPriority(int np);
public final int getPriority();
• Thread mit höchster Priorität läuft bis zum Thread-Ende
• Scheduling nur für Threads mit gleicher Priorität
Praktikum aus Softwareentwicklung 2
ThreadsSynchronisation (1/2)
• Schlüsselwörter– Variablen: volatile– Codeblöcke und Methoden: synchronizedBlöcke können auch verschachtelt sein
• Jedes Objekt hat einen Monitor (realisiert Lock)
26Java Praktikum – SS 2008 – [email protected]
• Jedes Objekt hat einen Monitor (realisiert Lock) – Eintritt in einen synchronized Block des Objekts nur möglich, wenn Zählerstand des Monitors auf 0, bei Eintritt wird Zählerstand erhöht.
– Nicht-synchronized Methoden können immer ausgeführt werden.
– synchronized wird nicht vererbt
Monitor
int countThreadThread
waiter
holder
*
0..1
Object
Praktikum aus Softwareentwicklung 2
ThreadsSynchronisation (2/2)
• <Object>.wait()
– ein Thread, der einen Lock auf <Object> hat, wird unterbrochen und kommt in eine Warteschlange
– Monitor wird freigegeben (Zähler auf 0 gesetzt)
27Java Praktikum – SS 2008 – [email protected]
– Monitor wird freigegeben (Zähler auf 0 gesetzt)
• <Object>.notify() oder notifyAll()– Ein Thread H (holder) gibt Zustandsänderung bekannt– Ein Thread W (waiter) kommt aus der Warteschlange und
blockt, bis H Monitor freigibt durch:• Beenden, bzw. Verlassen des synchronized Blocks• Geht selbst in Warteposition mit wait()
– Wenn W Monitor erhält, wird er aktiviert
Praktikum aus Softwareentwicklung 2
ThreadsProducer / Consumer Beispiel (1/2)
get()
ProducerThread
ConsumerThread
Data
28Java Praktikum – SS 2008 – [email protected]
• Consumer muss mit dem Lesen warten bis aktuelle Daten vorhanden sind
• Producer muss mit dem Schreiben warten, bis Consumer die aktuellen Daten abgeholt hat
put() get()DataObject
Praktikum aus Softwareentwicklung 2
ThreadsProducer / Consumer Beispiel (2/2)
Producer
run ()
Consumer
run ()
Dataval : int
newValue : boolean
get (): int
put (i:int)
11 11
Wartet bis Daten von C.
gelesen
Wartet bis Daten von P.
geliefert
29Java Praktikum – SS 2008 – [email protected]
class Consumer extends Thread {
Data dat;
Consumer(Data dat) {
this.dat = dat;
}
public void run() {
while (1==1) {
System.out.println(dat.get());
...
}
}
}
class Producer extends Thread {
Data dat;
Producer(Data dat) {
this.dat = dat;
}
public void run() {
while (1==1) {
dat.put(i); ...
}
}
}
gelesen geliefert
Praktikum aus Softwareentwicklung 2
ThreadsImplementierungsdetails (1/2)
• Schreiben auf Data
public synchronized void put(int i) {
while (newValue) {
30Java Praktikum – SS 2008 – [email protected]
while (newValue) {
try {
wait();
} catch(InterruptedException e) {}
}
val = i;
newValue = true;
notifyAll();
}
Praktikum aus Softwareentwicklung 2
ThreadsImplementierungsdetails (2/2)
• Lesen von Data
public synchronized int get() {
while (!newValue) {
try {
31Java Praktikum – SS 2008 – [email protected]
try {
wait();
} catch(InterruptedException e) {}
}
newValue = false;
notifyAll();
return val;
}
Praktikum aus Softwareentwicklung 2
ThreadsGruppen
• Gruppierung von Threads• Gemeinsame Eigenschaften, gemeinsame Manipulation
• Jeder Thread gehört zu einer Thread Gruppe (Zuordnung bei Instanziierung)
32Java Praktikum – SS 2008 – [email protected]
• Jeder Thread gehört zu einer Thread Gruppe (Zuordnung bei Instanziierung)public Thread(ThreadGroup group,String name)public final ThreadGroup getThreadGroup()
• Klasse ThreadGrouppublic ThreadGroup(String name)public ThreadGroup(ThreadGroup parent,String name)public static int enumerate(Thread[] tarray)public void destroy()
• Thread Gruppen können geschachtelt sein (Baum) public ThreadGroup getParent()
Praktikum aus Softwareentwicklung 2
Ende der 3. Übung
33Java Praktikum – SS 2008 – [email protected]