Ausgewählte Implementierungsprobleme - TZI

Werbung
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
Herunterladen