Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Praktikum aus Softwareentwicklung 2
1Java Praktikum – SS 2010 – [email protected]
Netzwerkprogrammierung & Threads
Praktikum aus Softwareentwicklung 2
Praktikum aus Softwareentwicklung 2
2Java Praktikum – SS 2010 – [email protected]
Netzwerkprogrammierung& Threads
• Netzwerkprogrammierung– URL, URLConnection, UDP, TCP
• Threads– Parallele Abläufe, Synchronisation, …
Praktikum aus Softwareentwicklung 2
3Java Praktikum – SS 2010 – [email protected]
Host ComputerHost Computer
NetzwerkprogrammierungGrundlagen (1/4)
• Kommunikation zwischen verteilten Programmen
Java Virtuelle
MaschineJava Virtuelle
Maschine
Netzwerk
Java Virtuelle
MaschineJVM, Web Server, Datenbank, Ftp..
Netzwerk Adapter Netzwerk Adapter
Praktikum aus Softwareentwicklung 2
4Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungGrundlagen (2/4)
Netzwerk
7: Application
6: Presentation
5: Session
4: Transport
3: Network
2: Data Link
1: Physical
OSI 7 Schichten
Application
Presentation
Session
Transport
Network
Data Link
Physical
OSI 7 Schichten
Übertragung
http://de.wikipedia.org/wiki/OSI-Modell
Praktikum aus Softwareentwicklung 2
5Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungGrundlagen (3/4)
• ISO OSI, IP und Java
Application
Presentation
Session
Transport
Network
Data Link
Physical
OSI 7 Schichten
Client oder Server: HTTP, FTP...
TCP, UDP
Internet Protocol
Ethernet, Token Ring, FDDI, ..
Internet
URL
Streams, Reader,
Writer
Socket…
InetAddress
java.net
Interface zum Netzwerk Adapter
Praktikum aus Softwareentwicklung 2
6Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungIP, TCP, UDP
• Internet Protocol (IP)– Routing der IP-Pakete (versehen mit Empfänger, Sender)
• Transport Control Protocol (TCP)– Verbindung: Aufbau eines Kommunikationskanal– 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 Verbindung - zustandslos– Pakete werden durch Anwendung gesendet– Paket kann verloren gehen, keine Kontrolle
Praktikum aus Softwareentwicklung 2
7Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungGrundlagen (4/4)
• http://www.ethereal.com/
Application
Presentation
Session
Transport
Network
Data Link
Physical
OSI 7 Schichten
Praktikum aus Softwareentwicklung 2
8Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungHTTP und URLs
• Hypertext Transfer Protocol (HTTP/1.1)• Uniform Resource Locator
protocol :// [user@] host [:port] /filepath [ref]
– RFC2396… http://www.rfc-editor.org/ http://www.w3.org/Addressing/URL/url-spec.html
• Beispiele:– http://www.somewhere.com:80/index.html
– https://meine.bank.com
– ftp://www.nowhere.net
– file://D:/tmp/sample.html
– mailto://[email protected]
Praktikum aus Softwareentwicklung 2
9Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungVerwendung von URLs
• Ein Objekt der Klasse java.net.URL repräsentiert eine Resource im Internet
try {
URL u = new URL("http://java.sun.com/index.html");
} catch(MalformedURLException e) { … }
• Parsen:
u.getProtocol();
u.getHost(); // ... (File, Port, Ref)
• Direktes Lesen von einer URL:
InputStream in = u.openStream();
Praktikum aus Softwareentwicklung 2
10Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungURLConnection
• Verbindung wird durch ein URLConnection Objekt repräsentiert und bei dessen Erzeugung aufgebaut.
URL u = new URL(„http://...“); URLConnection uc = u.openConnection();
• Datenaustausch erfolgt über Streams der
InputStream ui = uc.getInputStream(); OutputStream uo = uc.getOutputStream();
• HttpURLConnection
HttpURLConnection httpuc = (HttpURLConnection)uc; httpuc.getRequestMethod(); httpuc.getResponseMessage();
Praktikum aus Softwareentwicklung 2
11Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungBeispiel: "mailto:"
import java.io.*;import java.net.*;
... 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
12Java Praktikum – SS 2010 – [email protected]
Host 1169.254.235.246
Http-Client
• Sockets sind die Schnittstelle zwischen Anwendung und Netzwerkverbindung
• Host:Port zur Identifizierung der Anwendungen
• Die "Server"-Anwendung wartet auf einem vereinbarten Port auf Verbindungsaufnahmen durch Client-Anwendungen
NetzwerkprogrammierungSockets
9951 80
Http-Server
Host 2169.254.235.247
UDP: PaketeTCP: Stream
Praktikum aus Softwareentwicklung 2
13Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungTCP – verbindungsorientiert
• Kommunikation erfolgt bidirektional über Sockets• Socket := (Host, Portnummer)• Implementierung des Datenaustausches mit Streams• 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
14Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungTCP – Verbindungsaufbau
• Client Socket s = new Socket(<Host>,<Port>);
InputStream si = s.getInputStream();
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
15Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungUDP – paketorientiert
• Datenaustausch basiert auf Paketen (Datagramme)• DatagramPacket repräsentiert Datenpaket
– Paket zum Senden:DatagramPacket(byte[] buf, int length,
<Host>, <Port>)
– Paket zum Empfangen:DatagramPacket(byte[] b, int len)
• DatagramSocket zum Senden und Empfangen public void send(DatagramPacket d);
public void receive(DatagramPacket d);
Praktikum aus Softwareentwicklung 2
16Java Praktikum – SS 2010 – [email protected]
NetzwerkprogrammierungUDP – Senden/Empfangen
• InitialisierungDatagramSocket socket = new DatagramSocket(9998);
• Request schickenInetAddress 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
17Java Praktikum – SS 2010 – [email protected]
Netzwerkprogrammierung& Threads
• Netzwerkprogrammierung– URL, URLConnection, UDP, TCP
• Threads– Parallele Abläufe, Synchronisation, …
Praktikum aus Softwareentwicklung 2
18Java Praktikum – SS 2010 – [email protected]
ThreadsEigenschaften
• "Heavy-weight" Prozess– Adressraum– Ausführungszustand – Programmzähler, Ausführungs-Stack– 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
19Java Praktikum – SS 2010 – [email protected]
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 Konstruktor class Clock implements Runnable { public void run() { ... } } … Clock clk = new Clock(); Thread clkThread = new Thread(clk).start();
Praktikum aus Softwareentwicklung 2
20Java Praktikum – SS 2010 – [email protected]
ThreadsBeispiel: SimpleThread
public class ThreeThreadsTest {
public static void main (String[] args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
new SimpleThread(„Bora").start();
}
}
Leer-Implementierung
Haupt-programm von SimpleThread
VM erzeugt OS-Thread und ruft run() auf
java.lang.Thread
void run()void start()
SimpleThread
void run() {...}
Praktikum aus Softwareentwicklung 2
21Java Praktikum – SS 2010 – [email protected]
ThreadsLebenszyklus
Praktikum aus Softwareentwicklung 2
22Java Praktikum – SS 2010 – [email protected]
ThreadsSimpleThread Sequenzdiagramm
Praktikum aus Softwareentwicklung 2
23Java Praktikum – SS 2010 – [email protected]
ThreadsThread, Runnable und Object
Praktikum aus Softwareentwicklung 2
24Java Praktikum – SS 2010 – [email protected]
ThreadsBeispiel: Time Server
public class TimeServer {
public static void main (String args[])
throws IOException {
ServerSocket server = new ServerSocket(1234); 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
25Java Praktikum – SS 2010 – [email protected]
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( 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
26Java Praktikum – SS 2010 – [email protected]
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: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
27Java Praktikum – SS 2010 – [email protected]
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) – 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
Praktikum aus Softwareentwicklung 2
28Java Praktikum – SS 2010 – [email protected]
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)• <Object>.notify() oder notifyAll()
– Ein Thread H (holder) gibt Zustandsänderung bekannt– Ein Thread W (waiter) kommt aus der Warteschlange und wartet, 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
29Java Praktikum – SS 2010 – [email protected]
ThreadsProducer / Consumer Beispiel (1/2)
• Consumer muss mit dem Lesen warten bis aktuelle Daten vorhanden sind
• Producer muss mit dem Schreiben warten, bis Consumer die aktuellen Daten abgeholt hat
Praktikum aus Softwareentwicklung 2
30Java Praktikum – SS 2010 – [email protected]
ThreadsProducer / Consumer Beispiel (2/2)
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); ...
}
}
}
Praktikum aus Softwareentwicklung 2
31Java Praktikum – SS 2010 – [email protected]
ThreadsImplementierungsdetails (1/2)
• Schreiben auf Data
public synchronized void put(int i) {
while (newValue) {
try {
wait();
} catch(InterruptedException e) {} } val = i; newValue = true;
notifyAll();
}
Praktikum aus Softwareentwicklung 2
32Java Praktikum – SS 2010 – [email protected]
ThreadsImplementierungsdetails (2/2)
• Lesen von Data
public synchronized int get() {
while (!newValue) {
try {
wait();
} catch(InterruptedException e) {} } newValue = false;
notifyAll();
return val;
}
Praktikum aus Softwareentwicklung 2
33Java Praktikum – SS 2010 – [email protected]
ThreadsGruppen
• Gruppierung von Threads• Gemeinsame Eigenschaften, gemeinsame Manipulation
• Jeder Thread gehört zu einer Thread Gruppepublic 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 seinpublic ThreadGroup getParent()
Praktikum aus Softwareentwicklung 2
34Java Praktikum – SS 2010 – [email protected]
Ende der 3. Übung