1 Byteströme. 2 Spezialisierungen von Strömen. Lösungsskizze Aufgabe 1. Hinweise Aufgabe 2. Streams (Ein-/Ausgabe) Sockets (Netzwerkprogrammierung)

Ähnliche Dokumente
Programmieren 2 Selbststudium Semesterwoche 6

Netzwerkprogrammierung & Threads

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

31 Network Programming

Programmieren in Java

CLIENT SERVER. 1 Model-View-Controller (2) 2 Observer. 1 Model-View-Controller. "elements of reusable design" Beispiele:

Netzwerkprogrammierung

2 Verbindungslose Kommunikation mit UDP

1. Netzwerkprogrammierung für mobile Geräte

Programmieren 2 09 File-IO

Programmieren I. Kapitel 15. Ein und Ausgabe

Vorlesung Programmieren

Rechnernetze II SS Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/ , Büro: H-B 8404

Internetanwendungstechnik (Übung)

Ein- und Ausgabe in Java

Netzprogrammierung: Kommunikation über Sockets

Programmieren II. Timer. Vorlesung 11. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester Timer. Sockets.

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Advanced Network Programming

Transmission Control Protocol (TCP)

Dr. Monika Meiler. Inhalt

E.1 Object Request Brokers

Netzwerkprogrammierung mit Java

GUI Events. Entstehen bei jeder Eingabe über die Bedienoberfläche (Maus bewegen, Maus Tasten drücken, Tastatur,...

Programmieren II. Sockets. Vorlesung 16. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Sockets.

VS4 Slide 1. Verteilte Systeme. Vorlesung 4 vom Dr. Sebastian Iwanowski FH Wedel

Programmieren in Java

Kapitel 4: Design von Client/Server-Software. Middleware in Java vieweg 2005 Steffen Heinzl, Markus Mathes

4. Thread- und Netzwerk- Programmierung

PROG 2: Einführung in die Programmierung für Wirtschaftsinformatiker

Beispiel Time Client/Server

Informatik B. Vorlesung 16 Netzwerkprogrammierung. Dr. Ralf Kunze

Einführung in die Informatik Files and Streams

1. Mit dem Socket zum Server

Java Schulung. Objektorientierte Programmierung in Java Teil VI: Wichtige Java Pakete. Prof. Dr. Nikolaus Wulff

Teil 1: Ein einfacher Chat

Vorlesung Programmieren

Programmiermethodik. Übung 13

Klassenattribute und -methoden, Vererbung

Programmieren I und II

Klausur MPGI

TCP/IP Socket Programmierung in C# (Ci sharp) Multicast und Broadcast

Distributed Computing Group

Tafelübung zu BS 4. Interprozesskommunikation

CS1024 Internetbasierte Systeme

II.1.1. Erste Schritte - 1 -

Liebe Leserin, lieber Leser, in der ersten Auflage von Programmieren lernen mit Java von Hans- Peter Habelitz sind einige Fehler zu korrigieren.

JDBC. Allgemeines ODBC. java.sql. Beispiele

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

Dr. Monika Meiler. Inhalt

UDP Datagramme und Sockets

PREV CLASS NEXT CLASS FRAMES NO FRAMES All Classes

1. Netzwerkprogrammierung für mobile Geräte

Verteilte Systeme - 1. Übung

von Anja Austermann Drag and Drop

Klausur zur Vorlesung Verteilte Systeme im SS 2007 Prof. Dr. Odej Kao 24. Juli 2007

7. Pakete Grundlagen der Programmierung 1 (Java)

3.5 SSL Verbindungen. JSSE (Java Secure Socket Extension) import javax.net.ssl.* Wesentliche Pattern) Änderung im Client Programm: (Factory.

Primitive Datentypen

Praktikum Datenbanken und verteilte Systeme Sommersemester 2015

3 Objektorientierte Konzepte in Java

Multicast dt. Gruppenruf. Robert Tolksdorf und Peter Löhr

Programmieren in Java

TCP/IP Programmierung. C# TimeServer Java6 TimeClient

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

3 Objektorientierte Konzepte in Java

Name: Matr.-Nr.. Aufgaben: Punkte erreicht. 1. Klient mit Socket Server mit Sockets Java RMI Klienten und Server PHP 9.

Service Engineering. Einbindung von Web Services in eine Java-Anwendung. Prof. Dr. Andreas Schmietendorf 1. SoSe Service Engineering

Javakurs für Anfänger

Dr. Monika Meiler. Inhalt

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

TCP-Sockets in Java und C. Verteilte Systeme Hochschule Regensburg Vorlesung 4, Universitätsstraße 31, Regensburg

Java Einführung Methoden in Klassen

Advanced Network Programming

Remote Method Invocation

1 Polymorphie (Vielgestaltigkeit)

VS: Verteilte Systeme Kap. 02 Kommunikation Prinzipien und Realisierung mit Sockets. Wolfgang Wiedermann FH Regensburg FH. Teil 1

Networking. Motivation Grundlagen von Sockets Klasse Socket Klasse ServerSocket Exceptions Klasse URL

Javakurs 2013 Objektorientierung

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Ein erstes Java-Programm

Programmieren in Java

Socket-Programmierung in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Angewandte IT-Sicherheit

Projektaufgabe Peer-To-Peer Chat Programm

Synchronisation in Java. Invisible Web

Datenbankanwendungsprogrammierung Crashkurs Java

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

3. Konzepte der objektorientierten Programmierung

Java-Programmierung. Remote Method Invocation - RMI

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Domain Name Service (DNS)

Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition)

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Transkript:

C Überblick über die 2. Übung C Überblick über die 2. Übung 1 Byteströme Lösungsskizze Aufgabe 1 Hinweise Aufgabe 2 Streams (Ein-/Ausgabe) Benutzer Sockets (Netzwerkprogrammierung) Serialisierung Universität Erlangen-Nürnberg Informatik 4, 2005 C-Uebung2.fm 2005-10-25 09.54 C.1 read() InputStream Datensenke Bytestrom write() Bytestrom OutputStream Datenquelle C.3 C sdf 2 Spezialisierungen von Strömen Grundlegendes Konzept: Ströme (Streams) Wo kommen die Daten her, wo gehen sie hin? Byteströme (InputStream/OutputStream) Zeichenströme (Reader/Writer) FileInputStream Datei FileOutputStream C.2 C.4

2 Spezialisierungen von Strömen (2) 2 Spezialisierungen von Strömen (4) Wo kommen die Daten her, wo gehen sie hin? Wo kommen die Daten her, wo gehen sie hin? Datei FileInputStream ByteArrayInputStream byte[] Datei FileInputStream ByteArrayInputStream byte[] FileOutputStream ByteArrayOutputStream FileOutputStream ByteArrayOutputStream C.5? SocketInputStream Internet SocketOutputStream C.7 2 Spezialisierungen von Strömen (3) 3 Klassendiagram der Eingabeströme Wo kommen die Daten her, wo gehen sie hin? InputStream Datei FileInputStream ByteArrayInputStream byte[] ByteArrayInputStream FileInputStream PipedInputStream FileOutputStream ByteArrayOutputStream FilterInputStream SequenceInputStream DataInput SocketInputStream Internet SocketOutputStream C.6 ObjectInput BufferedInputStream PushbackInputStream DataInputStream ObjectInputStream Universität Erlangen-Nürnberg Informatik C.8 4, 2005 C-Java-Streams.fm 2005-10-31 11.41

4 FileInputStream 5 Kombinieren von Strömen Aus einer Datei lesen: Aus einfachen Strömen komfortable Ströme generieren import java.io.*; Der komfortable Strom umhüllt den einfachen Strom public class InTest { public static void main (String argv[]) throws IOException { FileInputStream f = new FileInputStream ("/tmp/test"); byte buf[] = new byte[4]; f.read(buf); Decorator Design-Pattern C.9 C.11 4 FileOutputStream 5 Kombinieren von Strömen (2) In eine Datei schreiben: import java.io.*; public class OutTest { public static void main (String argv[]) throws IOException { FileOutputStream f = new FileOutputStream ("/tmp/test"); byte buf[] = new byte[4]; for (byte i=0; i < buf.length; i++) buf[i]=i; f.write(buf); C.10 Datenquelle Bytestrom read() InputStream Benutzer C.12

5 Kombinieren von Strömen (3) 7 Reader/Writer Zeichenströme zur Ein- und Ausgabe (Reader, Writer) Benutzer Benutzer InputStream readint() DataInputStream C.13 Zeichen-- strom read() Reader write() Writer Zeichenströme enthalten Unicodezeichen (16 bit) Datensenke Zeichenstrom Datenquelle Bytestrom Datenquelle C.15 6 DataInputStream 8 Reader InputStream ist relativ unkomfortabel DataInputStream wird verwendet um eine binäre Darstellung der Daten zu lesen (int, float,...) Ein DataInputStream kann aus jedem InputStream erzeugt werden: InputStream in = new FileInputStream ("/tmp/test"); DataInputStream datain = new DataInputStream(in); float f = datain.readfloat(); readline() kann verwendet werden um ganze Zeilen zu lesen (Deprecated) : for(;;) { String s = datain.readline(); System.out.println(s); C.14 wichtige Methoden: int read() liest ein Zeichen und gibt es als int zurück int read(char buf[]) liest Zeichen in ein Array. Liefert die Anzahl der gelesenen Zeichen zurück oder -1 falls ein Fehler aufgetreten ist int read(char buf[], int offset, int len) liest len Zeichen in den Puffer buf, beginnend ab offset long skip(long n) überspringt n Zeichen void close() schließt den Strom C.16

8 FileReader 10 Gepufferte Ein-/Ausgabe Wird verwendet um aus einer Datei zu lesen Konstruktoren: FileReader(String filename) FileReader(File file) FileReader(FileDescriptor fd) Keine weitere Methoden (nur die von InputStreamReader geerbten) Was ist ein InputStreamReader? Lesen/Schreiben von einzelnen Zeichen kann teuer sein. Umrechnung der Zeichenkodierung kann teuer sein. Falls möglich BufferedReader, BufferedWriter verwenden. BufferedReader kann aus jedem anderen Reader erzeugt werden. Wichtige Methoden von BufferedWriter: void flush(): Leert den Puffer - schreibt den Puffer zum ungepufferten Writer: Puffer C.17 Datenquelle... Reader read() BufferedReader Benutzer C.19 9 Byte- und Zeichenströme 10 Gepufferte Ein-/Ausgabe (2) Umwandeln von Byteströmen in Zeichenströme mit Hilfe einer Codierung Codierung Local Unicode A Benutzer B... Bytestrostrom Zeichen- InputStream InputStreamReader Bytestrom Datenquelle read() Reader BufferedReader kann ganze Zeilen lesen: String readline() BufferedReader in = new BufferedReader(new FileReader("test.txt")); String line = in.readline(); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line = in.readline(); einige Codierungen: "Basic Latin", "Greek", "Arabic", "Gurmukhi" C.18 C.20

11 PrintWriter C sdf Kann von jedem OutputStream oder Writer erzeugt werden. println(string s): schreibt den String und das/die EOL Zeichen. Beispiel: Datei einlesen und auf der Standardausgabe ausgeben: import java.io.*; public class CopyStream { public static void main(string a[]) throws Exception { BufferedReader in = new BufferedReader( new FileReader("test.txt")); PrintWriter out = new PrintWriter(System.out); for(string line; (line = in.readline())!=null;) { out.println(line); out.close(); C.21 Netzwerk / Internet C.23 12 FileWriter 1 Adressierung: InetAddress FileWriter wird verwendet um Zeichen in eine Datei zu schreiben. Nachdem das Schreiben beendet ist sollte close() aufgerufen werden! IP-Adresse: DNS-Form: www4.informatik.uni-erlangen.de durch Punkte getrenntes Quadtupel: 131.188.34.40 java.net.inetaddress enthält IP-Adressen InetAddress hat keinen öffentlichen Konstruktor. Instanzen können folgendermassen erzeugt werden: getlocalhost() getbyname(string hostname) C.22 getallbyname(string hostname) InetAddress stellt Konvertierungsmethoden zur Verfügung: byte[] getaddress(): IP-Adresse in Bytearray String gethostaddress(): Stringdarstellung String gethostname(): Rechnername (DNS-Form) C.24

2 Sockets 3 Socket UDP verbindungslos, unzuverlässig TCP verbindungsorientiert, zuverlässig C.25 java.net.socket wird serverseitig verwendet um auf Verbindungsanfragen von s zu warten accept wartet auf Verbindungsanfragen für eine neue Verbindung wird ein neues Socket-Objekt zurückgegeben: Socket serversocket = new Socket(10412); Socket socket = serversocket.accept(); close schließt den Port. C.27 3 Verbundungsorientierte Sockets 3 Ein- / Ausgabe über Sockets java.net.socket TCP/IP zuverlässig Repräsentiert einen Kommunikationsendpunkt bei einem oder einem Erzeugen eines neun Sockets: socket= new Socket("www4.informatik.uni-erlangen.de",80); Ein Kommunikationsendpunkt ist definiert durch Rechnername und Port (Ports: 16 bit, < 1024 privilegiert) close schließt den Socket. C.26 Lesen von einem Socket mittels InputStream: InputStream instream = socket.getinputstream(); Schreiben auf einen Socket mittels OutputStream: OutputStream outstream = socket.getoutputstream(); aus diesen Strömen können leistungsfähigere Ströme erzeugt werden: DataOutputStream out = new DataOutputStream(new BufferedOutputStream(outStream)); C.28

3 TCP / 3 TCP / (3) Socket serversocket = new Socket(); hal hal Socket serversocket = new Socket(); Socket socket = serversocket.accept(); // accept blockiert C.29 Socket socket = new Socket("hal",); C.31 3 TCP / (2) 3 TCP / (4) hal Socket serversocket = new Socket(); Socket socket = serversocket.accept(); // accept blockiert hal Socket serversocket = new Socket(); Socket socket = serversocket.accept(); // accept kehrt zurück C.30 Socket socket = new Socket("hal",); C.32

3 TCP / (5) 4 UDP Empfänger Socket serversocket = new Socket(); Socket socket = serversocket.accept(); InputStream in = socket.getinputstream(); OutputStream out = socket.getoutputstream(); hal Pakete an einem bestimmten Port empfangen: DatagramSocket socket = new DatagramSocket(10412); byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); InetAddress from = packet.getaddress(); int bytesreceived = packet.getlength(); Socket socket = new Socket("hal",); InputStream in = socket.getinputstream(); OutputStream out = socket.getoutputstream(); C.33 C.35 4 Verbindungslose Sockets 4 UDP Sender java.net.datagramsocket UDP/IP unzuverlässig: Datagramme können verloren gehen! geringe Latenzzeit Konstruktoren: DatagramSocket(int port) bindet an den lokalen Port port DatagramSocket() bindet an irgendeinen lokalen Port Methoden: send(datagrampacket packet) sendet ein Paket, die Zieladresse muss im Paket eingetragen sein receive(datagrampacket packet) empfängt ein Paket, die Absenderadresse ist im Paket enthalten C.34 Pakete von einem beliebigen Port verschicken: DatagramSocket socket = new DatagramSocket(); byte[] buf = new byte[1024]; buf[0] =... InetAddress addr = InetAddress.getByName("faui40"); int port = 10412; DatagramPacket packet; packet = new DatagramPacket(buf, buf.length, addr, port); socket.send(packet); C.36

5 Multicast-Sockets 5 Multicast-Sockets Multicastgruppe java.net.multicastsocket verbindungslos (Unterklasse von DatagramSocket) verwendet IP-Adressen der Klasse D (224.0.0.1 bis 239.255.255.255) nach dem Erzeugen des Sockets kann man Pakete verschicken Um Pakete zu empfangen muss man der Gruppe beitreten mittels joingroup() Die Paketverbreitung wird mit Hilfe des Parameters time-to-live (TTL) gesteuert. Beispiel: C.37 InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket socket = new MulticastSocket(6789); socket.settimetolive((byte)2); socket.joingroup(group); C.39 5 Multicast-Sockets 6 Zusammenfassung Socket: Endpunkt ( oder ) einer TCP-Kommunikation enthält Zieladresse / -port und lokalen Port Daten werden mittels Strömen (Streams) gelesen und geschrieben Socket: ein -Endpunkt, erzeugt Instanzen von Socket DatagramSocket: UDP-Kommunikation Multicastgruppe send()/receive() um Daten zu verschicken / empfangen. Zieladresse ist in einem DatagramPacket-Objekt enthalten. C.38 MulticastSocket: Multicast-UDP-Kommunikation verwendet einen reservierten Bereich von IP-Adressen bevor man Daten empfängt, muss man mittels joingroup() einer Multicastgruppe beitreten C.40

C sdf 2 Beispiel Motivation: Objekte sollen von der Laufzeit einer Anwendung unabhängig sein Objekte sollen zwischen Anwendungen ausgetauscht werden können Speichern eines Strings und eines Date-Objekts: FileOutputStream f = new FileOutputStream("/tmp/objects"); ObjectOutput s = new ObjectOutputStream(f); s.writeint(42); s.writeobject("today"); s.writeobject(new Date()); s.flush(); f.close(); Lesen der Objekte: C.41 FileInputStream in = new FileInputStream("/tmp/objects"); ObjectInputStream s = new ObjectInputStream(in); int i = s.readint(); String today = (String)s.readObject(); Date date = (Date)s.readObject(); //! ClassNotFoundException in.close(); C.43 1 Objektströme 3 Schnittstellen Mit Objektströmen können Objekte in Byteströme geschrieben werden und von dort gelesen werden. Klasse java.io.objectoutputstream void writeobject(object o): Serialisierung eines Objekts (transitiv) (java.io.notserializableexception) Klasse java.io.objectinputstream Object readobject(): Lesen eines serialisierten Objekts (ClassNotFoundException) C.42 Marker Interface java.io.serializable: Instanzvariablen werden automatisch gesichert Variablen, die mit transient deklariert wurden, werden nicht gesichert (Klassenvariablen (static) auch nicht) Interface java.io.externalizable: Ein Objekt kann seine Serialisierung selbst vornehmen folgende Methoden müssen implementiert werden: writeexternal(objectoutput out) readexternal(objectinput in) C.44

4 Probleme 5 Versionskontrolle der Klassen Alle Objekte eines Objekt-Graphen sollten in den gleichen Strom geschrieben werden, ansonsten werden die Objekte beim lesen dupliziert using one stream serialisierte Objekte müssen mit der richtigen Klasse gelesen werden serialisierte Objekte enthalten dazu eine Klassenreferenz, welche den Namen und eine Versionsnummer der Klasse enthält Die Versionsnummer wird durch einen Hash-Wert repräsentiert, der über den Klassennamen, die Schnittstellen und die Namen der Instanzvariablen und Methoden gebildet wird. Problem: kleine Änderungen an der Klasse führen dazu, dass alte serialisierte Objekte unlesbar sind. using two streams C.45 Lösung: eine Klasse kann ihre Versionsnummer festlegen: static final long serialversionuid = 1164397251093340429L; initiale Versionsnummer kann mittels serialver berechnet werden. Versionsnummer nur nach inkompatiblen Änderungen verändern C.47 4 Probleme (2) der Objekt-Graph muss atomar geschrieben werden Klassen werden nicht gespeichert: sie müssen verfügbar sein, wenn ein Objekt später wieder eingelesen wird statische Elemente werden nicht gesichert Lösung: Serialisierung beeinflussen: private void writeobject(java.io.objectoutputstream out) private void readobject(java.io.objectinputstream in) C.46