33
Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung & Threads Praktikum aus Softwareentwicklung 2 1 Java Praktikum – SS 2008 – [email protected] Praktikum aus Softwareentwicklung 2

Netzwerkprogrammierung & Threads - bioinf.at · Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung & Threads •Netzwerkprogrammierung –URL, URLConnection, UDP, TCP •Threads

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]