Networking RMI Literatur Ausgewählte Implementierungsprobleme Rebecca Tiarks 19. Januar 2009 1 / 55 Networking RMI Literatur Inhaltsverzeichnis 1 Networking 2 RMI 2 / 55 Networking RMI Literatur Adressierung in IP-Netzen IP-Adresse 32 Bit lang zur besseren Lesbarkeit schreibt man die Bytes als Dezimalzahl mit Punkten getrennt 131.220.4.1 Kommunikation in einem Netzwerk und zwischen Netzwerken IP-Adresse besteht aus Netwerk-ID und Host-ID muss eindeutig sein 3 / 55 Networking RMI Literatur IP-Routing Verbindungsaufbau zwischen verschiedenen Netzwerken Netzwerke eigentlich voneinander getrennt Informationsaustausch mit Hilfe von Routern Router ist in mehreren Netzen enthalten ein Datenpaket wird es zuerst an den Router übermittelt kann der Router den Zielcomputer erreichen wird Paket direkt übermittelt ansonsten nachschauen in der Routing-Tabelle 4 / 55 Networking RMI Literatur DNS Domain Name System IP-Adressen sind schlecht zu merken Zuordnung von IP-Adressen zu DNS-Namen ein DNS-Name besteht aus dem Computernamen und der Domäne x11.informatik.uni-bremen.de Computer: x11 Domäne: informatik.uni-bremen.de 5 / 55 Networking RMI Literatur Client-Server-Schema Verbindungen laufen oft nach dem Client-Server-Schema ab ein Rechner stellt einen bestimmten Dienst zur Verfügung (Server) wartet passiv bis eine Verbindung zu ihm aufgebaut wird ein anderer Computer möchte Dienst nutzen (Client)und muss eine Verbindung zum Server aufbauen genaue Unterscheidung zwischen Client und Server schwierig, da Server auch wieder Client sein kann. ein Server soll mehrere Dienste anbieten können, deshalb Ports 6 / 55 Networking RMI Literatur Ports jeder Dienst auf dem Server läuft auf einem anderen Port Port-Nummer ist eine Ganzzahl und in Gruppe System und Benutzer eingeteilt System-Ports liegen zwischen 0 - 1023 User-Ports 1024 - 65535 Portnummern beliebig festlegbar allerdings inoffzielle Standards wie: FTP Port 21, HTTP Port 80 7 / 55 TCP/IP Networking RMI Literatur TCP verschiedene Techniken zum kommunizieren über ein IP-Netz Aufbauen eines Kommunikationskanals (point-to-point) Daten können in beide Richtungen übertragen werden wird von TCP (Transmission Control Protocol) verwendet TCP ist verbindungsorientiert und zuverlässig automatische Fehlerkorrektur: Daten kommen so an wie sie verschickt wurden für jeden Computer muss ein eigener Kanal geöfnet werden 9 / 55 Networking RMI Literatur UDP UDP (User Datagram Protocol) verbindungslos und ohne Fehlerkorrektur Verwaltung der Datenpakete (Datagrams) muss selbst erleigt werden kein Verbindungsaufbau - schneller und weniger Netzwerkbelastung nur einzelne Datenpakete werden verschickt keine Überprüfung ob Pakete erfolgreich angekommen sind UDP unterstützt Multicasting (versenden an mehrere Empfänger) 10 / 55 Networking RMI Literatur Sockets Kommunikationsschnittstelle zwischen zwei Programmen zum Austausch von Daten über das Netzwerk Applikation fordert einen Socket vom Bestriebssystem an anschließend können Daten über den Socket verschickt und empfangen werden Betriebssystem verwaltet Sockets und Verbindungsinformationen Adresse ist IP und eine eindeutige Port Adresse Stream-Sockets kommunizieren über einen kontinuierlichen Zeichen-Datenstrom Datagramm Sockets basieren auf Senden von einzelnen Nachrichten 11 / 55 Networking RMI Literatur Client Client kennt IP-Adresse des Servers und erstellt ein Socket-Objekt zusätzlich muss noch die Portnummer bekannt sein Socket s = new Socket ( " www . uni - bremen . de " , 80); potentielle Probleme: der Konstruktor wandelt DNS-Name in IP um (evtl. kein Netzwerk erreichbar) UnknownHostException Umwandlung kostst Zeit, deshalb besser nur einmal vornehmen Klasse InetAdress InetAdress uni = InetAdress . getByName ( " www . uni - bremen . de " ); Socket s = new Socket ( uni , 80); 12 / 55 Networking RMI Literatur Sockets nach Namensauflösung wird Verbindung aufgebaut ist an dem Port kein Server installiert ConnectException Sockets bestehen aus zwei Streams OutputStream zum Senden InputStream zum Empfangen diese kann man Abfragen mit getInputStream getOutputStream 13 / 55 Networking RMI Literatur Streams Streams (Datenströme) werden verwendet um Daten in ein Programm einzulesen, bzw. aus einem auszugeben zahlreiche Klassen in Java in dem Paket java.io Unterscheidung in zeichen- und byteorientiert zeichenorientiert für Buchstaben, Wörter, Texte byteorientiert für alle anderen Arten von Datenaustausch (Grafiken, Objekte) Grund: Zeichen basieren auf zwei Bytes, Daten nur auf einem 14 / 55 Networking RMI Literatur Zeichenorientierte Streams Klassen sind abgeleitet von der Klasse java.io.Reader bzw. java.io.Writer java.io.BufferedReader gepufferte, effiziente Eingabemöglichkeit java.io.InputStreamReader liest 1 Byte Zeichen ein und wandelt diese in 2 Byte Zeichen um java.io.FileReader Zeichen aus Dateien einlesen mit autom. Umwandlung von 1 Byte in 2 Byte java.io.StringReader nutz String als Datenquelle (keine Daten aus der Umgebung) 15 / 55 Networking RMI Literatur FileReader public static void main ( String [] args ) { Reader read = null ; try { read = new FileReader ( " dir / file . txt " ); for ( int c ; ( c = read . read () ) != -1; ) System . out . print ( ( char ) c ); } catch ( IOException e ) { System . err . println ( " Error Occured " ); } finally { try { read . close (); } catch ( Exception e ) { } } } 16 / 55 Networking RMI Literatur Byteorientierte Streams Klassen sind abgeleitet von der Klasse java.io.InputStream bzw. java.io.OutputStream java.io.BufferedInputStream gepuffertes, effizientes einlesen java.io.FileInputStream Daten aus einer Datei lesen java.io.FilterInputStream Daten können beim Einlesen gefiltert bzw. verarbeitet werden 17 / 55 Networking RMI Literatur Sockets nach Namensauflösung wird Verbindung aufgebaut ist an dem Port kein Server installiert ConnectException Sockets bestehen aus zwei Streams OutputStream zum Senden InputStream zum Empfangen diese kann man Abfragen mit getInputStream getOutputStream 18 / 55 Networking RMI Literatur Senden und Empfangen try { InputStream in = s . getInputStream (); OutputStream out = s . getOutputStream (); while ( true ) { byte b = ( byte ) in . read (); out . write ( b ); } } catch ( Socket Exception e ) { } catch ( IOException e ) { } 19 / 55 Networking RMI Literatur Trennen von Senden und Empfangen gleichzeitiges Senden und Empfangen ist nicht ganz einfach Bsp. Daten von Tastatureingabe sollen an Server gesendet werden und Antwort soll am Bildschirm dargestellt werden Problem: Lesen der Daten und Empfangen blockieren beide die Ausführung Lösung: Aufteilung des Programms in einen sendenden und empfangenden Thread 20 / 55 Networking RMI Literatur Server Programm muss deutlich machen, dass es an einem Port einen Dienst zur Verfügung stellt dafür wird ein ServerSocket-Objekt erstellt ServerSocket server = new ServerSocket(5555) an Port 5555 wird ein Server registriert ist der Port bereits belegt gibt es eine BindException hat man nicht die Berechtigung einen Server zu betreiben (Port-Nummer von 0 bis 1023) gibt es es eine SecurityException immer mit close() beenden, sonst Port belegt 21 / 55 Networking RMI Literatur Auf eine Verbindung warten nach Registrierung muss Server auf Verbindung warten Methode accept() bei erfolgreicher Verbindung mit Client liefert wird Socket zurückgeliefert Socket kann genauso wie beim Client verwendet werden ServerSocket server = new ServerSocket (5555); Socket sock = server . accept () InputStream in = sock . getInputStream (); OutputStream out = sock . getOutputStream (); 22 / 55 TCP/IP Networking RMI Literatur Verschicken von Paketen neben dem Verschicken der Pakete über einen sicheren Kanal (TCP) können Daten auch als einfache Pakete verschickt werden UDP keine Verbindungs- und Fehlerüberprüfung in Java die Klasse DatagrammSocket Pakete werden als Objekte von Typ DatagramPacket versendet neben den Nutzdaten werden noch weitere Informationen mitgesendet 24 / 55 Networking RMI Literatur UDP Header besteht aus vier 16-Bit Feldern Quell-Port Ziel-Port Länge Prüfsumme Daten Quellport: Portnummer des Senders (nötig damit Empfänger antworten kann) optional und kann auf 0 gesetzt werden Zielport: Empfänger Längenfeld gibt die Größe des Paketes an bestehend aus Daten und Header Prüfsummenfeld: optionale 16-Bit große Prüfsumme über Header und Daten (wird fast immer benutzt) 25 / 55 Networking RMI Literatur Informationen setzen je nachdem ob man ein Paket senden oder empfangen möchte Sendeprogramm gibt Informationen im Konstruktor an Erzeugen eines Feldes (hier mit Datum) Konstruktor für Paket benötigt das Feld gefolgt von der Länge außerdem IP und Port des Zielrechners muss die Klasse InetAdress verwendet werden byte [] buffer = ( newDate ()). toString (). getBytes (); DatagramPacket pack = new DatagramPacket ( buffer , buffer . length , InetAdress . getByName ( " 192.168.0.1 " ) , 5556); 26 / 55 Networking RMI Literatur Empfangsprogramm Empfangsprogramm erzeugt Paket für den Empfang, muss aber nicht alle Informationen angeben nur die Informationen für das Byte-Array Puffer einrichten der die Daten des empfangenen Paketes aufnehmen kann WICHTIG: ist der Puffer zu klein gehen überschüssige Informationen verloren die einzelnen Informationen des Paketes lassen sich nachträglich setzen oder auslesen getAdress, getPort, getData, getLength, getOffset setAdress, setPort, setData, setLength, setOffset byte [] buffer = new byte [100]; DatagrammPacket receivePack = new DatagrammPacket ( buffer , 10 27 / 55 Networking RMI Literatur Senden und Empfangen Erzeugen eines DatagrammSocket-Objektes DatagramSocket udpSend = new DatagrammSocket (5555); DatagramSocket udpReceive = new DatagrammSocket (5556); zum Senden und Empfangen wird der entspr. Methode das Paket übergeben udpSend . send ( pack ); udpReceive . receive ( receivePack ); sobald ein Socket-Objekt nicht mehr gebraucht wird close() Methode aufrufen udpSend . close (); udpReceive . close (); 28 / 55 Networking RMI Literatur Mehrere Empfänger versenden an mehrere Empfänger Multicasting definieren einer Multicast-Gruppe bilden einer Gruppe über IP-Adressen bestimmter Bereich von IP-Adressen ist für Mehrfachadressierung vorgesehen 244.0.0.3 bis 255.255.255.255 29 / 55 Networking RMI Literatur Mitglieder einer Gruppe Clients müssen sich in eine Multicastgruppe eintragen zuerst wird ein Socket erstellt jedoch ein MulcticastSocket MulticastSocket udpReceive = new MulticastSocket (5600); Port-Nummer muss bei allen Gruppenmitgliedern identisch sein der Client muss der Multicastgruppe beitreten Methode joinGroup aufrufen mit Multicast-IP InetAdress gruppe = InetAdress . getByName ( " 228.2.3.4 " ); udpReceive . joinGroup ( gruppe ); Gruppe kann auch wieder verlassen werden (vor dem close() Aufruf) udpReceive . leaveGroup ( gruppe ); 30 / 55 Networking RMI Literatur Senden an eine Gruppe Versenden durch Senden an die Gruppen-IP Sender muss nicht Mitglied der Gruppe sein DatagramPacket pack = new DatagramPacket ( buffer , buffer . length , InetAdress . getByName ( " 228.2.3.4 " ) ,5600); gemeinsamer Port der Gruppe wird verwendet 31 / 55 TCP/IP Networking RMI Literatur URI und URL URI Uniform Resource Identifier besteht aus einer Zeichenfolge und ist ein Identifikator für eine abstrakte oder physische Ressource eine URL hat immer ein Protokoll und ist die Spezialisierung einer URI die URL enthält Informationen zum Auffinden einer Ressource (locator) in Java wird ein URL-Objekt durch die Klasse java.net.URL repräsentiert 33 / 55 Networking RMI Literatur Zugriff auf Internet-Ressourcen URL Uniform Resource Locator Hilfsmittel zur Adressierung von Internet-Ressourcen eine URL besteht aus einem Protokollbezeichner und einer Adresse getrennt durch die Zeichenkette :// Standardprotokoll zur Übertragung von Webseiten http viele weitere: ftp, file, news Adresse besteht aus DNS-Namen und mit Doppelpunkt getrennt eine optionale Portnummer außerdem durch einen Schrägstrich getrennten Dateinamen http://www.informatik.uni-bremen.de/index.html 34 / 55 Networking RMI Literatur HTTP Protokoll auf Anwendungsschicht Anwendungen müssen Daten austauschen und jedes Programm hat eigene Anforderungen Schnelligkeit, Fehlerfreiheit usw. Protokolle auf der Anwendungsschicht sehr vielfältig HTTP (Hypertext Transfer Protocol) Webserver überträgt auf Anforderung eine Datei pro Verbindung immer nur eine Datei für zweite Datei neue Verbindung 35 / 55 Networking RMI Literatur URI und URL URI Uniform Resource Identifier besteht aus einer Zeichenfolge und ist ein Identifikator für eine abstrakte oder physische Ressource eine URL hat immer ein Protokoll und ist die Spezialisierung einer URI die URL enthält Informationen zum Auffinden einer Ressource (locator) in Java wird ein URL-Objekt durch die Klasse java.net.URL repräsentiert 36 / 55 Networking RMI Literatur Zugriff auf Internet-Ressourcen Objekt kann über die String-Repräsentation erzeugt werden URL url = new URL ( " http :// www . uni - bremen . de / index . html " ); weitere Konstruktoren zur getrennten Angabe der Zugriffsart, Host-Name, Port etc. URL url = new URL ( " http " , " www . uni - bremen . de " , 80 , " index . html " ); relative Adressen (Basisadresse muss bekannt sein) URL domainUrl = new URL ( " http :// www . uni - bremen . de " ); URL indexUrl = new URL ( domainUrl , " index . html " ); 37 / 55 Networking RMI Literatur Informationen über eine URL nach Anlegen des URL-Objektes können Informationen nur noch abgefragt werden nicht alle URL-Adressen lassen sich detailliert aufschlüsseln einige Zugriffsmethoden sind nur für HTTP sinnvoll getProtocol liefert Protokoll getHost liefert den Host-Namen falls möglich (file liefert leeren String) getPort Port-Nummer oder -1 getRef liefert Anker (alles nach dem #) getPath Pfad der URL ohne Anker getQuery liefert Anfragestring (alles nach dem ?) 38 / 55 Networking RMI Literatur Informationen über eine URL URL url = new URL ( " http :// www .b - sc . de /? p = Fahrten09 & m =1 " ); System . out . println ( System . out . println ( System . out . println ( System . out . println ( System . out . println ( System . out . println ( System . out . println ( url . getProtocol () ); url . getHost () ); url . getPort () ); url . getFile () ); url . getPath () ); url . getQuery () ); url . getRef () ); http www.b-sc.de -1 /?p=Fahrten09&m=1 / p=Fahrten09&m=1 null 39 / 55 Networking RMI Literatur Zugriff auf die Daten URL-Objekte besitzen die Methode openStream() liefert InputStream für den Empfang der Inhalte sind Objekte der Klasse URLConnction verantwortlich außerdem können auch Daten an eine URL gesendet werden (z.B. Formuare) Zugriff auch per Sockets möglich ohne die Klasse URL 40 / 55 Networking RMI Literatur Die Klasse URLConnection HTTP lastig, da viele Methoden haben nur für URLs auf Webseiten Bedeutung Klasse stellt Methoden bereit um HTTP-Header zu lesen Dateien vom Webserver besitzen Informationen über den Inhalt Inhalt kann abgefragt werden über getInputStream oder getContent getContent ist umständlich da eigene ContentHandler erforderlich sind 41 / 55 Networking RMI Literatur Arbeiten mit URL-Objekten 1. Erzeugen des URL-Connection-Objektes URLConnection connection = url . openConnection (); 2. Setzen der Anfrage-Attribute setDoInput soll Nutzer Input empfangen setDoOutput darf Nutzer Output senden setConnectTimeout setzen eines Timeouts für eine Verbindung setReadTimeout Timout für das Lesen setzen .. und weitere 42 / 55 Networking RMI Literatur Arbeiten mit URL-Objekten 3. Verbindung herstellen (Methode erzeugt automatisch einen Socket und fragt die Header-Informationen ab) connection . connect (); 4. Header-Informationen können abgefragt werden getContentType Art des Inhalts z.B. text/plain getContentLength Länge des Inhalts getDate Datum getLastModified letztes Änderungsdatum 5. Zugriff auf die Daten getInputStream 43 / 55 Networking RMI Literatur Passwort geschützte Seiten Verbindungen können durch Basic Authentication (Passwort) geschützt sein Anwender müssen einen Namen und ein Passwort eingeben um mit einem Java-Programm an die Webseite zu kommen muss Name und Passwort gesendet werden. java.net.Authenticator Authenticator . setDefault ( new Authenticator () { protected P a s s w o r d A ut he nti ca ti on g e t P a s s w o r d A u t h e n t i c a t i on () { System . out . printf ( " url =% s , host =% s , ip =% s , port =% s % n " , getRequestingURL () , getRequestingHost () , getR equest ingSite () , getRequestingPort () ); return new P a s s wo rdA ut he nti ca ti on ( " joeuser " , " a . b . C . D " . toCharArray () ); } 44 / 55 Networking RMI Literatur Verteilte Programmierung Methoden bieten Dienstleistung an liefert zu Eingabeparametern Ausgabewerte oder verändert einen Systemzustand liegt die implementierte Methode auf einem anderen Rechner enferte Methodenaufrufe Client-Server-Systeme Stellvertreterobjekte lassen die entfernte Server-Funktionen aussehen wie lokale Funktionen Stellvertreterfunktion nimmt Parameter, verpackt sie und schickt Anfrage an Stellvertreterfunktion auf dem Server 45 / 55 Networking RMI Literatur Java Remote Method Invocation Mechanismus um in Java entefernte Objekte und deren Angebote zu nutzen realisiert Methodenaufrufe auf hohem Abstraktionsniveau Server stellt das entfernte Objekt bereit. Funktion läuft im Adressraum vom Server und Server leitet Anfragen weiter Namensdienst (Registry) verbindet Objekte und ihre Methoden mit einem eindeutigen Namen Server meldet Objekte und Funktionen bei Namensdienst an Client ist Nutzer des Dienstes und ruft Methode zu entferntem Objekt auf (fragt beim Namensdienst anch ob er Zugriff bekommt) 46 / 55 RMI Modell Networking RMI Literatur Probleme Kommunikationssystem muss vorhanden sein: was passiert es zusammenbricht? beide Rechner haben unerschiedliche Lebenszyklen: können beide kommunizieren? Timout Bearbeitung nimmt viel mehr Zeit in Anspruch als bei lokalen Methoden gemeinsamer Kontext fehlt - unterschiedliche Speicherbereiche 48 / 55 Networking RMI Literatur Getrennter Speicher Daten müssen erst Übertragen werden Server arbeitet mit Kopie der Daten Objekte die von mehreren verwendet werden, Objektreferenzen? Übertragung der Objekte muss exklusiv erfolgen Objekte müssen immer vollständig serialisiert werden beide Partner müssen sich auf ein Austauschformat einigen 49 / 55 Networking RMI Literatur Umsetzung Server 1. entfernte Schnittstelle mit Methoden deklarieren damit entfernte Methode genutzt werden kann wird ein Stellvertreterobjekt benötigt wird von Java autom. erzeugt muss auf dem Server deklariert sein und die Signaturen eindeutig spezifiziert Java Interface mit den Methoden import java . rmi . Remote ; import . java . rmi . RemoteException ; public interface Mult extends Remote { int mult ( inx x , int y ) throws RemoteException ; } 50 / 55 Networking RMI Literatur Umsetzung Server 2. Remote-Objekt implementieren Client nutzt das Objekt vom Server Server muss die Remote-Schnittstelle implementieren diese kann anschließend exportiert und angemeldet werden public interface MultImpl extends Mult { int mult ( inx x , int y ) { return x * y ; } } 51 / 55 Networking RMI Literatur Umsetzung Server 3. Anmelden beim Namensdienst (Registry) damit der Client das Objekt finden kann muss es mit öffentlichem Namen angemeldet werden RMI-Registry kann durch Server selber oder externes Java-Dienstprogramm aufgerufen werden import java . rmi . registry .*; try { LocateRegistry . createRegistry ( Registry . REGISTRY_PORT ); MultImpl multi = new MultImpl (); Mult stub = ( Mult ) U n ic a s tRemoteObject . exportObject ( multi , 0 ); } 52 / 55 Networking RMI Literatur Anmelden beim Namensdienst entweder erweitert die Remote-Objekt-Implementierung de Klasse UnicastRemoteObject oder das Objekt wird von Hand exportiert UnicastRemote-Object.exportObject() anschließend wird Objekt beim Namensdienst angemeldet rebind() oder bind() Notation beim Anmelden ist wie eine URL rmi://Host:Port/Objektname 53 / 55 Networking RMI Literatur Umsetzung Client Client muss entferntes Objekt suchen und ansprechen fragt beim Namensdienst an zusammengesetzt aus URL und Dienstnamen public class Client { public static void main ( String [] args ) throws RemoteException , NotBoundException { Registry registry = LocateRegistry . getRegistry (); Mult mult = ( Mult ) registry . lookup ( " Mult " ); } } 54 / 55 Networking RMI Literatur Christian Ullenboom. Java ist auch eine Insel. Galileo Computing, 7 edition, 2008. ISBN 978-3-8362-1146-8. 55 / 55