Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung & Threads Praktikum aus Softwareentwicklung 2 Java Praktikum – SS 2008 – [email protected] 1 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung & Threads • Netzwerkprogrammierung – URL, URLConnection, UDP, TCP • Threads – Parallele Programme, Synchronisation, … Java Praktikum – SS 2008 – [email protected] 2 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung Grundlagen (1/2) • Kommunikation zwischen verteilten Programmen Host Computer Host Computer Java Virtuelle Maschine JavaVirtuelle Virtuelle Java JVM, Web Server, Maschine Maschine Datenbank, Ftp.. Netzwerk-Betriebssystem Netzwerk-Betriebssystem Netzwerk Java Praktikum – SS 2008 – [email protected] 3 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung Grundlagen (2/2) • ISO OSI, IP und Java - http://www.ethereal.com/ OSI 7 Schichten Application Presentation Session Transport Network Data Link Physical Internet java.net URL etc. http, ftp, telnet, ... Streams TCP, UDP Internet Protocol Ethernet, Token Ring, FDDI, .. Socket… InetAddress Java Praktikum – SS 2008 – [email protected] 4 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung HTTP 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/remoteSurvey.html https://secure.tiscover.com:443 ftp://www.nowhere.net/ file://D:/tmp/bsp.html mailto://[email protected] Java Praktikum – SS 2008 – [email protected] 5 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung Verwendung von URLs • Ein Objekt der Klasse java.net.URL repräsentiert eine Ressource im Internet try { URL u = new URL("http://java.sun.com/index.html"); } 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(); Java Praktikum – SS 2008 – [email protected] 6 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung URLConnection • 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(); • Datenaustausch erfolgt über Streams der URLConnection InputStream ui = uc.getInputStream(); OutputStream uo = uc.getOutputStream(); • HttpURLConnection HttpURLConnection http_uc = (HttpURLConnection)uc; uc.getRequestMethod(); uc.getResponseMessage(); Java Praktikum – SS 2008 – [email protected] 7 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung Beispiel: "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(); ... Java Praktikum – SS 2008 – [email protected] 8 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung TCP/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 – Ü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 Java Praktikum – SS 2008 – [email protected] 9 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung Sockets • Sockets sind die Schnittstelle zwischen Anwendung und Netzwerkverbindung • Host:Port zur Identifizierung der Anwendungen Host 1 169.254.235.246 Client 9951 UDP: Pakete TCP: Stream Host 2 169.254.235.247 80 HttpServer • Die "Server"-Anwendung wartet auf einem vereinbarten Port auf Verbindungsaufnahmen durch Client-Anwendungen Java Praktikum – SS 2008 – [email protected] 10 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung UDP – 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); Java Praktikum – SS 2008 – [email protected] 11 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung UDP – Senden/Empfangen • Initialisierung DatagramSocket socket = new DatagramSocket(9998); • Request schicken InetAddress address = InetAddress.getByName("host"); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 8889); socket.send(packet); • Response empfangen packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String received = new String(packet.getData()); Java Praktikum – SS 2008 – [email protected] 12 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung TCP – 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 und wartet auf einer bestimmten Portnummer auf Anfragen: public Socket accept(); • Verbindungsabbruch durch Schließen des Sockets Java Praktikum – SS 2008 – [email protected] 13 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung 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 Java Praktikum – SS 2008 – [email protected] 14 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung Datenaustausch • Lesen vom InputStream, schreiben auf den OutputStream • Protokoll muss vereinbart werden – Kodierung der Daten – 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") Java Praktikum – SS 2008 – [email protected] 15 Praktikum aus Softwareentwicklung 2 Netzwerkprogrammierung & Threads • Netzwerkprogrammierung – URL, URLConnection, UDP, TCP • Threads – Parallele Programme, Synchronisation, … Java Praktikum – SS 2008 – [email protected] 16 Praktikum aus Softwareentwicklung 2 Threads Eigenschaften • "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 Java Praktikum – SS 2008 – [email protected] 17 Praktikum aus Softwareentwicklung 2 Threads Implementierung 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(); Java Praktikum – SS 2008 – [email protected] 18 Praktikum aus Softwareentwicklung 2 Threads Beispiel: SimpleThread Runnable Thread void run() void start() SimpleThread void run() Hauptprogramm von SimpleThread LeerImplement ierung VM erzeugt OS-Thread und ruft run() auf public class ThreeThreadsTest { public static void main (String[] args) { new SimpleThread("Jamaica").start(); new SimpleThread("Fiji").start(); new SimpleThread(„Bora").start(); } } Java Praktikum – SS 2008 – [email protected] 19 Praktikum aus Softwareentwicklung 2 Threads Lebenszyklus Alive wait yield Created new start Running sleep [sleeptime is over] Suspended notify[All] interrupt Stopped Java Praktikum – SS 2008 – [email protected] 20 Praktikum aus Softwareentwicklung 2 Threads SimpleThread Sequenzdiagramm ThreeThreadsTest:Class main new start new jamaica:SimpleThread run fiji:SimpleThread start Java Praktikum – SS 2008 – [email protected] run 21 Praktikum aus Softwareentwicklung 2 Threads Thread, Runnable und Object <<interface>> Object notify () notifyAll () wait () ... Thread <<realizes>> Runnable run() Thread (name: String) Thread (r: Runnable) start () run () sleep (millis:long) yield () interrupt () isInterrupted () join () isDaemon () setDaemon () ... Java Praktikum – SS 2008 – [email protected] 22 Praktikum aus Softwareentwicklung 2 Threads Beispiel: 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(); } } } Java Praktikum – SS 2008 – [email protected] 23 Praktikum aus Softwareentwicklung 2 Threads Beispiel: 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); } } } Java Praktikum – SS 2008 – [email protected] 24 Praktikum aus Softwareentwicklung 2 Threads Prioritäten • Jeder Thread hat bestimmte Priorität public 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 ThreadEnde • Scheduling nur für Threads mit gleicher Priorität Java Praktikum – SS 2008 – [email protected] 25 Praktikum aus Softwareentwicklung 2 Threads Synchronisation (1/2) • Schlüsselwörter – Variablen: volatile – Codeblöcke und Methoden: synchronized Blö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 Object Monitor int count holder 0..1 Thread waiter * Java Praktikum – SS 2008 – [email protected] 26 Praktikum aus Softwareentwicklung 2 Threads Synchronisation (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 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 Java Praktikum – SS 2008 – [email protected] 27 Praktikum aus Softwareentwicklung 2 Threads Producer / Consumer Beispiel (1/2) Consumer Thread Producer Thread put() Data Object get() • Consumer muss mit dem Lesen warten bis aktuelle Daten vorhanden sind • Producer muss mit dem Schreiben warten, bis Consumer die aktuellen Daten abgeholt hat Java Praktikum – SS 2008 – [email protected] 28 Praktikum aus Softwareentwicklung 2 Threads Producer / Consumer Beispiel (2/2) Data Producer 1 run () Wartet bis Daten von C. gelesen val : int newValue : boolean get (): int put (i:int) class Producer extends Thread { Data dat; Producer(Data dat) { this.dat = dat; } public void run() { while (1==1) { dat.put(i); ... } } } Consumer 1 run () Wartet bis Daten von P. geliefert class Consumer extends Thread { Data dat; Consumer(Data dat) { this.dat = dat; } public void run() { while (1==1) { System.out.println(dat.get()); ... } } } Java Praktikum – SS 2008 – [email protected] 29 Praktikum aus Softwareentwicklung 2 Threads Implementierungsdetails (1/2) • Schreiben auf Data public synchronized void put(int i) { while (newValue) { try { wait(); } catch(InterruptedException e) {} } val = i; newValue = true; notifyAll(); } Java Praktikum – SS 2008 – [email protected] 30 Praktikum aus Softwareentwicklung 2 Threads Implementierungsdetails (2/2) • Lesen von Data public synchronized int get() { while (!newValue) { try { wait(); } catch(InterruptedException e) {} } newValue = false; notifyAll(); return val; } Java Praktikum – SS 2008 – [email protected] 31 Praktikum aus Softwareentwicklung 2 Threads Gruppen • Gruppierung von Threads • Gemeinsame Eigenschaften, gemeinsame Manipulation • Jeder Thread gehört zu einer Thread Gruppe (Zuordnung bei Instanziierung) public Thread(ThreadGroup group,String name) public final ThreadGroup getThreadGroup() • Klasse ThreadGroup public public public public ThreadGroup(String name) ThreadGroup(ThreadGroup parent,String name) static int enumerate(Thread[] tarray) void destroy() • Thread Gruppen können geschachtelt sein (Baum) public ThreadGroup getParent() Java Praktikum – SS 2008 – [email protected] 32 Praktikum aus Softwareentwicklung 2 Ende der 3. Übung Java Praktikum – SS 2008 – [email protected] 33