java.net Klassenbibliothek für den Datentransport im Netz

Slides:



Advertisements
Ähnliche Präsentationen
programmiert April-Juni 2003 von Knut Riechmann
Advertisements

der Universität Oldenburg
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java -
Tomcat Web-Server installieren
Internetzugriff mit Strings und Streams
10 Streams JavaHS Merseburg WS 05/06 E/A - Ströme (Streams) in Java.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java News & Music Der Chat
Threads Richard Göbel.
FH-Hof Sockets in Java Richard Göbel. FH-Hof Kommunikation über das Internet - Grundlagen Ein Rechner wird im Internet über die so genannte IP- Adresse.
Java: Grundlagen der Sprache
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
DO...WHILE Anweisung.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Ausnahmen1 Ausnahmen. DVG Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Datenströme DVG Datenströme.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Prof. K. Gremminger Folie 1 Vorlesung Datenbanksysteme SS 2002 Aufbau einer Verbindung zur Datenbank import java.net.URL; import java.sql.*; class JDBCExample.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Eine Entwicklungsumgebung im Web IFC-Seminar WS98/ Holger Otte.
Client-Server Kommunikation
Einführung Servlets/JSPs
Learning By Doing TCP/IP Netzwerke mit TCP/IP Das Internet verwendet weitgehend das rund 30-jährige TCP/IP-Protokoll (TCP: Transmission Control Protocol,
Socket-Programmierung
Netzwerkprogrammierung
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Internet und SMS Internet und SMS Daniel Rickenbacher Jeremy Deuel.
Praxis der Internet-Programmierung
CuP - Java Eingabe über Tastatur, AudioClips, überschreiben, Quiz Montag, 18. November 2002.
Optimale Ursprungsgerade
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
HTTP IT-Zertifikat Universität zu Köln Allgemeine Technologien II
Programmierung von Agenten in Java: Implementierung einer Supply-Chain
Programmiervorkurs WS 2014/15 Methoden
Voyager Eigenschaften/Vorzüge Universalität: –ROI-Modelle: CORBA, RMI, DCOM –verschiedene Namens-, Verzeichnisdienste Nachrichtentypen: synchron, oneway,
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Client-Server Kommunikation
Internet-Grundtechnologien. Client / Server Client („Kunde“): fordert Information / Datei an im Internet: fordert Internetseite an, z.B.
Java-Applets und URLs APP Philip Graf, Andreas Bößl.
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Threads in Java Threads  Sprachumfang von Java Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. Es gibt keine Forderung bzgl.:
Abteilung für Telekooperation Softwareentwicklung 2 UE WS 2008/09 SE2UE_ Ausnahmen (Exceptions)
Paketübertragung mit Sockets Was, wohin? Adressierung durch java.net.InetAddress Bsp: adr=InetAddress.getByName(“localhost“); Pakete sind java.net.DatagramPacket.
1 Servlets Stephan Baldes. 2 Was ist ein Servlet? S E R V L E T = Eine auf Java-Technologie basierte Web-Komponente, die von einem Container.
Realisierung verteilter Anwendungen: Teil 2 zInhalt heute: yKommunikation über Sockets yJava Remote Method Invocation, RMI zLernziele: yVerständnis eines.
OOP mit Java Oder: Java in 5 Tagen. 1. Tag Klassen und Methoden Hello World in Variationen Von Menschen und Geschlechtern Horden (Schlange stehen)
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, WS 2005/06 1 Beispiel class SpreadSheet { int cellA1, cellA2, cellA3; synchronized.
Ein-/ Ausgabe in Java ein Überblick. © eigentlich ganz einfach ? Ein-/Ausgabe durch package java.io Ausgabe (auf Konsole) mit System.out.println()
Netzwerk - Programmierung
Java I/O Input / Output stream Library
Java I/O Input / Output stream Library
Camil Bartkowiak Serhat Cinar Leonardo Di Lella Jan Finsel
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Dynamisches Laden von Klassen
Eine Präsentation von Amed Fabrik und Alicia Sieg
Klassenbibliotheken: Einbinden und Benutzen von Klassen
Schleifen mit der Turtle
Tutorstunde 10.
TCP/IP Transmission Control Protocol/Internet Protocol
 Präsentation transkript:

java.net Klassenbibliothek für den Datentransport im Netz Entfernte Ressourcen werden über URLs oder URIs identifiziert. Es werden verbindungorientierte und verbindungslose Datentransfers unterstützt. Die primitivste Art, Daten zu laden, arbeitet mit der Klasse URL http://hans:geheim@www.example.org:80/demo/example.cgi?land=de&stadt=aa#geschichte port Search part URL-path user host fragment protokol password Wikipedia : URL

Übertragungsarten Man unterscheidet zwischen verbindungsloser und verbindungsorientierter Datenübertragung Verbindunsgorientierte Datenübertragung mit den Klassen: URL URLConnection Socket, ServerSocket Verbindungslose Datenübertragung mit den Klassen: Datagramm, DatagrammSocket

Die Klasse URL (verbindungsorientiert) Methoden zur URL getProtocol() http, ftp, nfs, ldap, info … getHost() getPort() getFile() getQuery() Methoden zur Datenübertragung openStream() getContent() openConnection()

import java.net.*; import java.io.*; public class UrlLoad { public static void main(String args[]) if (args.length!=2) {System.err.println("Usage:..."); System.exit(1);} try URL url = new URL(args[0]); OutputStream o = new FileOutputStream(args[1]); InputStream i = url.openStream(); int len; byte buf[]=new byte[128]; while ((len=i.read(buf))!=-1) o.write(buf,0,len); o.close(); i.close(); } catch (MalformedURLException e) { System.out.println(e); System.exit(1);} catch (IOException e)

URLConnection (verbindungsorientiert) Sehr viel komfortabler Über get methods lassen sich viele Eigenschaften der entfernten Ressource erfragen getLength() getHeaderFields() Nach connect() ist der Datentransfer möglich InputStream getInputStream() OutputStream getOutputStream()

import java.net.*; import java.io.*; public class UrlCLoad { public static void main(String args[]) if (args.length!=2) {System.err.println("Usage:..."); System.exit(1);} try URL url = new URL(args[0]); URLConnection c = url.openConnection(); System.out.println("Length :"+c.getContentLength()); System.out.println("Type :"+c.getContentType()); System.out.println("Encoding :"+c.getContentEncoding()); System.out.println("header :"+c.getHeaderFields());

c.connect(); OutputStream O = new FileOutputStream(args[1]); InputStream I = c.getInputStream(); int len; byte buf[]=new byte[128]; while ((len=I.read(buf))!=-1) O.write(buf,0,len); O.close(); I.close(); } catch (Exception e) { System.out.println(e); System.exit(1);}

Einschränkung für Applets Applets haben nur Zugang zu dem Host, von dem sie selbst geladen worden sind. Methoden um diesen Host bzw. eine URL auf diesem Host zu ermitteln: URL getDocumentBase() Liefert die URL des Webdokuments, in das das Applet eingebettet ist URL getCodeBase() Liefert die URL des Verzeichnisses, das den Code des Applets enthält Mit url.getCodeBase()+File kann die Url einer Ressource im Pfad des Classfiles gebildet werden. Über get-Methoden lässt sich der Host ermitteln und kann so Grundlage zum Bau einer neuen URL werden.

Datagramme (verbindungslos) POST POST Übertragung, wie auch immer An:.....Zeuten ...... Ankomme Sonnabend 14.15 Uhr Rita

Datagramme Verbindungslose Datenübertragung Zwei Klassen werden benötigt DatagramSocket (entspricht dem Postamt) DatagramPacket (entspricht dem Formular) Das Datagram enthält die Adressinformationen des Empfängers, des Absenders und Daten in Form eines ByteArrays Werden mehrere Datagramme an einen Empfänger gesandt, so ist die Reihenfolge des Empfangs undefiniert, da jedes Datagram seinen eigenen Weg durch das (weltweite) Netzwerk finden muss.

Es ist nicht sichergestellt, dass ein Datagram seinen Empfänger wirklich erreicht. Reihenfolde des Sendens entspricht nicht unbedingt der Reihenfolge des Empfangens Datagramme übertragen eine kurze Information, sie sollten eine Größe von 8kByte nicht überschreiten.

Datagram versenden String myHost=“MeinHost.informatik,htw-dresden.de“ byte[] mess=args[0].getBytes(); // Liefert Internetadresse InetAddress addr=InetAddress.getByName(myHost); // Das Datenpaket DatagramPacket packs= new DatagramPacket (mess,mess.length, addr, myPort); // Der SendeSocket DatagramSocket ds = new DatagramSocket(); // Paket absenden ds.send(packs);

Datagram empfangen // leeres Datagramm bereitstellen DatagramPacket packr= new DatagramPacket(new byte[1024],1024); // Warten auf Empfang, Socket von voriger Folie weiter // verwendet ds.receive(packr); // Paket auspacken messr=new String(packr.getData(),0,packr.getLength()); System.out.println(messr); ds.close(); ByteArray von oben, Nur in der Länge getLength() auswerten!!

Client/Server Server: DatagramSocket mit Portnummer Leeres Datagram zum Empfangen Auf Empfang warten Antwort in empfangenes Datagram einsetzen Senden Client: DatagramSocket mit/ohne Portnummer Datagram mit Empfängerinformation Host (InetAddress) Port Message Länge Senden Mit dem selben DatagramSocket auf Antwort warten

Sockets (verbindungsorientiert) Grundsätzliches Konzept zur Datenübertragung Bedeutet soviel wie Sockel/Steckdose Universelle Schnittstelle zur Kommunikation zwischen Hosts Adressinformationen enthalten den Host und eine Schnittstellennummer, die Portnummer. Socket(String host, int port); serverseitiges „lauschen“ wird mit der Klasse ServerSocket realisiert, für den eigentlichen Datentransport gibt es die Klasse Socket.

Verwendung von ServerSocket import java.net.*; import java.io.*; import java.util.*; import java.lang.*; public class TestServ { public static void main(String argv[]) throws IOException ServerSocket ss = new ServerSocket(Integer.parseInt(argv[0])); while (true) new TinyServConn(ss.accept()); }

Mit diesem Stream wird der class TinyServConn extends Thread { Socket sock; TinyServConn(Socket s) sock=s; start(); } public void run() try String Command=null; String req,buf; System.out.println("Socket.localPort:"+sock.getLocalPort() +" Socket.port:"+sock.getPort()); BufferedReader BR = new BufferedReader (new InputStreamReader(sock.getInputStream())); while((buf=BR.readLine())!=null) System.out.println(buf); sock.close(); }catch(IOException e){System.out.println("I/O Error "+e);} Mit diesem Stream wird der Request gelesen

Bei jedem eingehenden Request wird ein neuer Thread erzeugt, der diesen Request bedient. Es wird ein Kommunikationskanal zw. einem lokalen, vom System vergebenen Port und dem entfernten Port, der die Verbindung angefordert hat, aufgebaut. Ein Browser soll zunächst als Client dienen Der Server gibt bei eingehendem Request alle Informationen, die der Request enthält auf die Konsole aus. Der Client erhält keine Antwort, und reagiert ggf. irgendwann mit timeout

Erzielte Ausgabe: > java TestServ1 12345 Socket.localPort:12345 Socket.port:45141 GET /spass HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.9 (like Gecko) SUSE Accept: text/html, image/jpeg, image/png, text/*, image/*, */* Accept-Encoding: x-gzip, x-deflate, gzip, deflate Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5 Accept-Language: de, en Host: localhost:12345 Connection: Keep-Alive Socket.localPort:12345 Socket.port:34241 GET /ScheespassAufDerStrasse HTTP/1.0 User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) SUSE Accept: text/html, image/jpeg, image/png, text/*, image/*, */* Accept-Encoding: x-gzip, x-deflate, gzip, deflate Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5 Accept-Language: de, en Host: 141.56.132.145:12345 Via: 1.1 rlux24.rz.htw-dresden.de:3128 (squid/2.7.STABLE5) X-Forwarded-For: 141.56.132.76 Cache-Control: max-age=259200 Connection: keep-alive

Daten sollen fließen public void run() { try String Command=null; String req="",S; byte buf[]=new byte[128]; BufferedReader BR= new BufferedReader(new InputStreamReader(sock.getInputStream())); // Finde die Zeile, die mit GET beginnt ! while(!(S=BR.readLine()).startsWith("GET"));req=S; System.out.println("Req:"+req); StringTokenizer st=new StringTokenizer(req);

if ((st.countTokens()>=2) && (Command=st.nextToken()).equals("GET")) { OutputStream out=sock.getOutputStream(); if ((req =st.nextToken()).startsWith("/")) req=req.substring(1); System.out.println("File to send: "+req); File F=new File(req); FileInputStream fis=new FileInputStream(req); int len; while ((len=fis.read(buf))!=-1) out.write(buf,0,len); sock.shutdownOutput(); } System.out.println("ready"); sock.close(); }catch(IOException e) {System.out.println("I/O Error "+e);}

Security Mit diesem Server kann jeder von überall auf alles zugreifen, wofür der Server Leserechte hat. Wirkungsvolle Abhilfe schafft der SecurityManager Es kann in einem JavaProzess immer nur ein SecurityManager laufen. Das Aktiviren eines SecurityManagers ist im Leben eines JavaProzesses nur einmalig möglich. Die Klasse SecurityManager stellen check...()- methoden zur Verfügung, die eine SecurityException werfen. Durch Überschreiben einzelner check-methoden werden gezielt Aktivitäten erlaubt.

Mit Security manager public static void main(String argv[]) throws IOException { Properties P=System.getProperties(); final String LibPath=P.getProperty("sun.boot.library.path"); System.setSecurityManager(new SecurityManager() public void checkAccept (String host, int port) {} public void checkPermission (Permission p){} //neu!! public void checkRead(String file) . . . } ); ServerSocket ss = new ServerSocket(Integer.parseInt(argv[0])); while (true) new TinyServConn(ss.accept());

Die Methode checkRead() public void checkRead(String file) { if(file.startsWith("/") | file.contains("..")) throw (new SecurityException("Fobidden Access: "+ file)); }

Die Methode checkRead() public void checkRead(String file) { if(file.startsWith("/") | file.contains("..")) throw (new SecurityException("Fobidden Access: "+ file)); } // für den Zugriff auf Klassenbibliothek if (file.startsWith(LibPath)) return; // für die eigene Klasse, startsWith geht nicht!! // offenbar wird ein absoluter Pfad gebildet if (file.endsWith("TinyServConn.class")) return;

Ein Client import java.net.*; import java.io.*; public class MyClient { public static void main(String args[]) if (args.length!=3) System.err.println("usage java MyClient <host> <port> >file>"); else try Socket s=new Socket(args[0],Integer.parseInt(args[1])); PrintStream O=new PrintStream(s.getOutputStream()); O.println("GET "+args[2]); O.println("\r"); BufferedReader I=new BufferedReader(new InputStreamReader(s.getInputStream())); String X; while((X=I.readLine())!=null) System.out.println(X); s.close(); }catch(Exception e){System.out.println(e);e.printStackTrace();} }

Ein paar kleine Verbesserungen Damit der Client im Fehlerfall ordentlich beendet wird, ist es nötig, den Stream auch im Fall einer Exception ordentlich herunterzufahren. In einer anderen Variante könnte man über das Fileobjekt prüfen, ob die Datei vorhandenund lesbar ist, so dass es erst gar nicht zur Exception kommt. }catch(IOException e) { System.out.println("I/O Error "+e); pout.println("Message form Server:"+e); try sock.shutdownOutput();sock.close(); }catch (Exception xyz){} } try in einem catch block

Die wahrscheinlich bessere Version: File F=new File(req); if (F.exists() && F.canRead() && F.isFile()) { FileInputStream fis=new FileInputStream(req); int len; while ((len=fis.read(buf))!=-1) out.write(buf,0,len); } else pout.println ("Message form Server:" +req +" not found or not readable or no File");