Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1 Networking Motivation Grundlagen von Sockets Klasse Socket Klasse ServerSocket Exceptions Klasse URL
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1�������������� ��������������
���������������������������
Networking
Motivation
Grundlagen von Sockets
Klasse Socket
Klasse ServerSocket
Exceptions
Klasse URL
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 2�������������� ��������������
���������������������������
Netzwerkprogrammierung in Java
� Programme schreiben, wobei Teile auf unterschiedlichen Rechnern laufen und diese Programmteile miteinander kommunizieren
� Grundproblematik der Netzwerkprogrammierung
• Zueinanderfinden der verteilten Programme
• Aufbau einer Verbindung
• Verständigung über die Kommunikation
• Austausch von Nachrichten
• Austausch von Daten
2 Modelle:
1. Socket-Streaming (dieses Kapitel)
2. Remote-Objekte (nächstes Kapitel)
������
�����
�������
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 3�������������� ��������������
���������������������������
Prinzipien von Socket-Streaming
� Adressierung über IP-Adressen und Ports
� Client und Server
• Client schickt Anforderung an Server
• Server behandelt Anforderung und
• schickt Antwort zurück
� Austausch von Daten zwischen Client und Server erfolgt über Byte-Streams ähnlich dem Dateizugriff (siehe Streaming)
� Daten müssen interpretiert werden; erfolgt unter Verwendung eines entsprechenden Protokolls, z.B. HTTP, SMTP oder andere
Damit steht Socket-Streaming im Gegensatz zu Remote-Objects, die die Semantik von Java-Objekten haben !!
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 4�������������� ��������������
���������������������������
IP-Addressierung
� 4 Byte IP-Adresse
� geteilt in Netzwerk-ID und eine Host-ID
� Adresstypen: Klassen A, B, C
� Domain-Namen: symbolische Namen für IP-Adressen
����� ����� ����� �����
Klasse-C-Netze sind für kleinere Unternehmen vorgesehen, die nicht mehr als 254 unterschiedliche Rechner adressieren müssen.
821C
Ein Klasse-B-Netz erlaubt immerhin noch die eindeutige Adressierung von 65534 unterschiedlichen Rechnern innerhalb des Netzwerks.
1614B
Für sehr große Netzbetreiber vorgesehen. 247A
BeschreibungHost-IDNetzwerk-IDKlasse
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 5�������������� ��������������
���������������������������
Ports
� Ports dienen dazu, Serverdienste auf einem Rechner zu identifizieren
� Ganzzahl im Bereich 0 .. 65535
� Viele Portnummern standardisiert:
BeschreibungTransportPortName
tcp
tcp
tcp
tcp
tcp
tcp
tcp
tcp
tcp/udp
tcp/udp
tcp/udp
Remote Method Invocation1099 rmi
Übertragen von Mails 110pop3
Der Web-Server 80www
Liefert Benutzerinformationen 79finger
Einfacher Namensservice 43 whois
Versenden von E-Mails 25smtp
Interaktive Session mit entferntem Host 23 telnet
Versenden und Empfangen von Dateien 21 ftp
Liefert ASCII-String mit Datum und Uhrzeit 13 daytime
Ignoriert jede Zeile, die der Client sendet 9 discard
Gibt jede Zeile zurück, die der Client sendet7echo
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 6�������������� ��������������
���������������������������
Sockets
� Sockets sind eine Programmierschnittstelle für streambasierteKommunikation
� Übertragen von Daten ähnlich dem Schreiben einer Datei
• Aufbau einer Verbindung über IP-Adresse und Port
• Lesen oder Schreiben von Daten
• Schließen der Verbindung
� In Java unterscheidet man zwischen Client- und Server-Sockets
• Client-Sockets (Klasse ����) für das eigentliche Lesen und Schreiben (sowohl am Client als auch am Server)
• Server-Sockets (Klasse ��������) für das Annehmen von Client-Requests
� Lesen und Schreiben erfolgt über ���������� und ������������
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 7�������������� ��������������
���������������������������
Wichtige Klassen von ����������������������������
� ����Socket für Data-Streaming
� ��������Socket für die Annahme von Requests am Server
� ��������Repräsentiert eine IP-Adresse
� ���Repräsentiert eine URL
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 8�������������� ��������������
���������������������������
Klasse �������� �������� �������� ��������
� Klasse �������� repräsentiert eine IP-Adresse
� ������-Methoden zur Erzeugung von ��������-Objekten
• Zugriff auf 4 Byte IP-Adresse
• symbolischer Name
������ ����� �������� �������� �������� �������� ����� ����� �������� ����������
������ �������� !"#����$%&��#����$%&��#����$%&��#����$%&��'�����# (���)"""
������ �������� #�$%������#�$%������#�$%������#�$%������'�%� ! ����)"
������ �������� #�$%������#�$%������#�$%������#�$%������'�����# (���*"�%� ! ����)"
������ �������� #�$%&��#�$%&��#�$%&��#�$%&��'�����# (���)"
������ �������� #������+���#������+���#������+���#������+���')"
�����# #�+���������#�+���������#�+���������#�+���������')"
�%� !"#�������#�������#�������#�������')"
�����# #�+���&��#�+���&��#�+���&��#�+���&��')"
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 9�������������� ��������������
���������������������������
Klasse ����������������
� Die Klasse ���� repräsentiert einen Socket für Data-Streaming mit
• Konstruktor zum Aufbau einer Verbindung mit Adresse und Port
• Zugriffsmethoden auf ��������� und ����������� für dieses ����-Objekt
������������������������ �������������������� ����
������������������������ ����'�����# ������*"������������ ����)
������������������������ ����' �������� ������*"������������ ����)"
������������������������ ��������� #� ���������')
������������������������ ����������� #������������')
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 10�������������� ��������������
���������������������������
Beipiel Client-Socket: Zugriff auf WebServer (1)
� Das folgende Beispiel zeigt eine Client-Anfrage an einen Web-Server
• Verbindungsaufbau erfolgt mit der in der Kommandozeile angegebenen Adresse des Web-Servers
• Es wird dabei ein ����-Objekt erzeugt, wobei der Port 80 als Standardport für WWW verwendet wird
• Danach werden vom ����-Objekt sowohl ein ��������� als auch �����������geholt
• Es erfolgt die Konstruktion und die Ausgabe eines HTTP GET-Kommandos an den Web-Server wobei das zweite Kommandozeilenargument den Dateinamen bestimmt
������������������������ �������������������� ������#,-.,"/������������������������ ������������������������ ���������������� ����'�����# !"��#�)"/
��%��%��%��% / �������� ������ 0" ���������#�$%&��'��#� .!)1"���� ��� 0"�2�2�2�2 ����'������*"�.)1
����������� ���"0"����#������������')1 ��������� ��"0"����#� ���������')133"456�7������� ���������#"�"0"8456"8"9"��#� :!"9"8"+66;3:�.8"9"8<�<�<�<�81����2���'��#�$%��'))1
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 11�������������� ��������������
���������������������������
Beipiel Client-Socket: Zugriff auf WebServer (2)
• Die Antwort vom Server wird über den ��������� zeilenweise gelesen und auf der Konsole ausgegeben
• Am Ende werden ���������, ���������� und ���� geschlossen
• Es folgt noch die ����(�Anweisung, um alle auftretenden �5�������� zu fangen
������������ ��1�%��%��%��%� !"�"0"�2�2�2�2 �%��%��%��%� :..!12(��2(��2(��2(�� ''�� 0"������'�))"=0"�:)"/�%��������2���'�*".*"��)1
>
�������')1��������')1��������')1
>"����(����(����(����( ' �5������� )"/�%��������������'��������#'))1�%�������':)1
>>
>
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 12�������������� ��������������
���������������������������
Klasse ��������������������������������
� Die Klasse Server���� repräsentiert den Einstieg in einen Server und dient dazu Client-Requests anzunehmen
• Konstruktor zum Anlegen eines ServerSockets mit entsprechender Portnummer. Der ServerSocket horcht damit auf den Port auf dem lokalen Rechner.
• Die wichtigste Methode ist die Methode �����. Mit dieser horcht der �������� auf hereinkommende Requests. Sie blockiert, bis ein Request am Port hereinkommt und liefert dann einen normalen Socket für die Datenkommunikation mit dem Client.
������������������������ �������������������� ��������
������������������������ ��������'������������ ����)"�(��2��(��2��(��2��(��2� �5�������
������������������������ ���� �����')
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 13�������������� ��������������
���������������������������
Beispiel ��������������������������������: �����5�(����������5�(����������5�(����������5�(����� (1)
� Das folgende Programm zeigt die Verwendung von ��������
• Der �������� wird mit Portnummer 7 erzeugt und horcht dann auf hereinkommende Client-Requests
• sobald ein Request eingeht, liefert ����� einen ���� für Ein- und Ausgabe.
������������������������ ��������?1������������������������ ��������?1
������������������������ �������������������� �����5�(����� /������������������������ ������������������������ ���������������� ����'�����# !"��#�)"/��%��%��%��% /�%���������������'8@��� ��A"B�������#"��A";���"C���8)1�������� �(�� 0"�2�2�2�2 ��������'C)1���� ���� 0"�(��������')1
�%���������������'8B�������# (�#�����8)1 ��������� ��"0"�����#� ���������')1����������� ���"0"�����#������������')1
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 14�������������� ��������������
���������������������������
Beispiel ��������������������������������: �����5�(����������5�(����������5�(����������5�(����� (2)
• Über ��������� �� und ����������� ��� erfolgt das Lesen der Daten vom Client und das Zurücksenden der selben Daten zum Client
• Danach werden alle Sockets geschlossen die Verbindung abgebaut.
������������ �12(��2(��2(��2(�� ''�"0"������'))"=0"�:)"/����2���''�(���(���(���(��)�)1�%�������������''�(���(���(���(��)�)1
>
�%���������������'8B�������# ����8)1���������')1�(�������')1
>"����(����(����(����( ' �5������� )"/�%��������������'��������#'))1�%�������':)1
>>
>
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 15�������������� ��������������
���������������������������
Beispiel Mehrere Client bedienen: 5�(�����5�(�����5�(�����5�(����� (1)
� Normalerweise will ein Server viele einkommende Clients bedienen
� Dies wird erreicht, indem der accept-Aufruf in eine Schleife verpackt und für jeden einkommenden Client-Request ein eigener Thread EchoClientThread erzeugt wird.
������������������������ ��������?1������������������������ ��������?1
������������������������ �������������������� 5�(����� /������������������������ ������������������������ ���������������� ����'�����# !"��#�)"/������������ ��� 0".1��%��%��%��% /�%���������������'8@��� ��A"B�������#�"��A";���"C���8)1�������� �(�� 0"�2�2�2�2 ��������'C)12(��2(��2(��2(�� '������������)"/���������������� ���������������� 0"0"0"0"�(���������(���������(���������(��������')1')1')1')1''''�2�2�2�2 5�(�D����6(���'99���5�(�D����6(���'99���5�(�D����6(���'99���5�(�D����6(���'99���*"*"*"*"����))����������))����������))����������))������')1')1')1')1
>>"����(����(����(����( ' �5������� )"/�%��������������'��������#'))1�%�������':)1
>>
>
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 16�������������� ��������������
���������������������������
Beispiel Mehrere Client bedienen: 5�(�����5�(�����5�(�����5�(����� (2)
� In der ���-Methode des EchoClientThreads werden die Daten wie gehabt gelesen und zurückgeschickt.
�������������������� 5�(�D����6(��� �������������������� 6(��� /
������������������������ ������������ ���1������������������������ ���� ����1
������������������������ 5�(�D����6(���'������������ ���*"���� ����)"/�(���(���(���(������ 0"���1"�(���(���(���(������� 0"����1
>
������������������������ ���������������� ���')"/��%��%��%��% / ��������� ��"0"�����#� ���������')1����������� ���"0"�����#������������')1����2���''��# 9"8<�<�8)�#�$%��'))1������������ �12(��2(��2(��2(�� ''�"0"������'))"=0"�:)"/����2���''�(���(���(���(��)�)1�%�������������''�(���(���(���(��)�)1
>���������')1
>"����(����(����(����( ' �5������� )"/�%��������������'��������#'))1
>>
>
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 17�������������� ��������������
���������������������������
Beispiel E-Mail senden
� E-Mail senden erfolgt nach dem SMTP-Protokoll auf Port 25
� Das SMTP-Protokoll hat folgendes Format
+5��"������"+���E� �"F��EG"H5�E���"�����"��"�������I�D;6"6�G"H5�E���"�����"��"5��AJ�#��IK�6�F���G"H5�E���"�����"��"�������I������G"H$��AAI6�G"H5�E���"�����"��"5��AJ�#��IK��G"HK����I
5�E���"&��(���(�"��"�(���"L����M� 6
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 18�������������� ��������������
���������������������������
Beispiel E-Mail senden
� Verbindungsaufbau erfolgt • durch Öffnen eines ����s zum E-Mail-Host
• und Erzeugen eines ;����@����s und eines ����s für den Socket
� Senden von Nachrichten erfolgt durch zeilenweises Schicken der Protokollanweisungen und Daten, wobei
• jedes Zeile mit N<�<�N abgeschlossen werden muss
• Nach jedem Kommando und nach dem gesamten Text jeweils die Antwortzeilen gelesen werden müssen
� Die DATA Section• Sollten jeweils Zeilen enthalten mit Angabe von
- Absender (From: …),
- Empfänger (To: …),
- Datum
- Betreff (Subject: …)
• mehrere Zeilen mit Nachricht- Text mit beliebigen ASCII-Zeichen, jedoch ohne die Steuerzeichen SP, HAT, CR, LF
• Am Ende einen einzelnen Punkt . in einer Zeile
���� �������� 0"�2�2�2�2 ����'N������������������������N*"O-)1;����@���� ���"0"�2�2�2�2 ;����@����'���������#������������'))1$�AA������ ��"0"�2�2�2�2 $�AA������'
�2�2�2�2 �������������'���������#� ���������')))1
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 19�������������� ��������������
���������������������������
Beispiel E-Mail senden ������������������������ ������������������������ ���������������� ����'�����# !"��#�)"/
����"��������1$�AA������"��1;����@����"���1
��%��%��%��% /��������"0"�2�2�2�2 ����'8������������������������8*"O-)1
���"0"�2�2�2�2 ;����@����'���������#������������'))1��"0"�2�2�2�2 $�AA������'�2�2�2�2 �������������'���������#� ���������')))1
����'��)1"�����#"(���&��"0" ���������#������+���')�#�+���&��')1���'���*"8+5��"8"9"(���&��)1����'��)1"���'���*"8E� �"F��EG"H�������������P�����I8)1����'��)1"���'���*"8�D;6"6�G"H(��������(�A�P�����I8)1����'��)1"���'���*"8K�6�8)1����'��)1"���'���*"8F���G"�������������P�����8)1���'���*"86�G"A�������%�P�����8)1���'���*"8K��G"8"9"K��F������#�K��6�� ������')�A�����'�2�2�2�2 K��')))1"���'���*"8������G"O"����#"E���8)1���'���*"88)1���'���*"8K��"���"��"E���8)1���'���*"8���"�2�"L����8)1���'���*"8�8)1����'��)1"���'���*"8M���8)1����'��)1"�������������')1
>"����(����(����(����( '����2�+���5�������")"/����������6���')1
>"����(����(����(����( ' �5�������")"/����������6���')1
>>
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 20�������������� ��������������
���������������������������
Beispiel E-Mail senden (Forts.)
3??"�����"�"���"A���"$�AA������"��"?"P�����P�����P�����P����� ��?"P�����P�����P�����P�����?"P�(��2�P�(��2�P�(��2�P�(��2� �5�������?3������������������������ ������������������������ �����#"����'$�AA������"��)"�(��2��(��2��(��2��(��2� �5�������"/
�����#"���"0"���������')1�A�A�A�A '���"00"����������������)"/
���"0"881>�%���������������'8����"'������#)G8"9"���)1�������������������� ���1
>
3??"����"�"���"��";����@����"���?"P�����P�����P�����P����� ���?"P�����P�����P�����P����� ���?"P�(��2�P�(��2�P�(��2�P�(��2� �5�������?3������������������������ ������������������������ ���������������� ���';����@����"���*"�����#"���)"�(��2��(��2��(��2��(��2� �5�������"/
���������'���)1�%���������������'8����"'�����#)G"8"9"���)1���������'8<�<�8)1����A���(')1
>
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 21�������������� ��������������
���������������������������
URLs
� URL vereinfacht das Abholen von Informationen auf Remote-Sites
• URL wird mit dem String, der die Remote-Ressource adressiert, angelegt, z.B. File http://java.sun.com/index.html
• Erlaubt einen InputStream für ein URL zu holen; mit diesem kann die Ressource gelesen werden
• Mit getContent kann der gesamte Inhalt der URL-Ressource geholt werden
• Mit openConnection wird eine URLConnection geöffnet
������������������������ A����A����A����A���� �������������������� ���"�������������������������������� ������������������
������������������������ ���'�����# ���)"�(��2��(��2��(��2��(��2� E��A�������5�������public URL(String protocol, String host, int port, String file)
throws MalformedURLException
������������������������ A����"A����"A����"A����" ��������� ��������') �(��2��(��2��(��2��(��2� �5�������
������������������������ A����"A����"A����"A����"����� #�D�����') �(��2��(��2��(��2��(��2� �5�������
������������������������ ���D�������� ���D��������') �(��2��(��2��(��2��(��2� �5�������
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 22�������������� ��������������
���������������������������
Beipiel URL: Sichern eine Remote-Resource (1)
� Das folgende Beispiel liest eine Ressource und sichert den Inhalt in einer Datei
• Die URL wird mit der in der Kommandozeile gegebenen Adresse der Ressource erzeugt
• Es wird eine Datei und ein OutputStream auf die Datei erzeugt
• Es wird auf den InputStream der URL zugegriffen
������������������������ ��������?1������������������������ ��������?1
������������������������ �������������������� ������/
������������������������ ������������������������ ���������������� ����'�����# !"��#�)/
��%��%��%��% /���"��� 0"�2�2�2�2 ���'��#� .!)1����������� ���"0"�2�2�2�2 F�������������'��#� :!)1 ��������� ��"0"������������')1
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 23�������������� ��������������
���������������������������
Beipiel URL: Sichern eine Remote-Resource (2)
• Die Daten werden gelesen und auf den File ausgegeben
• Wichtig ist das Abfangen der entsprechenden Exceptions
������������ ��1�%��%��%��%� !"�"0"�2�2�2�2 �%��%��%��%� :..!12(��2(��2(��2(�� ''�� 0"������'�))"=0"�:)"/����2���'�*".*"��)1
>��������')1�������')1
>"����(����(����(����( 'E��A�������5������� )"/�%��������������'��������#'))1�%�������':)1
>"����(����(����(����( ' �5������� )"/�%��������������'��������#'))1�%�������':)1
>>
>
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 24�������������� ��������������
���������������������������
5��������5��������5��������5��������
� Netzwerkkommunikation ist grundsätzlich eine unsichere Sache
� Es gibt daher eine Vielzahl von Exceptions, die die möglichen Pannen gut verdeutlichen
Exception-Hierarchie: �5������� �5������� �5������� �5������� : Basisklasse für alle Exceptions mit IO
E��A�������5�������E��A�������5�������E��A�������5�������E��A�������5������� ungültige URL
����5�����������5�����������5�����������5������� Basisklasse für Exceptions bei Sockets
$���5�������$���5�������$���5�������$���5������� Fehler bei Versuch Socket an eine lokaleAdresse oder Port zu binden
D�����5�������D�����5�������D�����5�������D�����5������� Fehler bei Versuch Socket an eine remoteAdresse oder Port zu verbinden
&�����6�+���5�������&�����6�+���5�������&�����6�+���5�������&�����6�+���5������� Remote Host kann nicht erreicht werden
;��������(���5�������;��������(���5�������;��������(���5�������;��������(���5������� Port konnte nicht erreicht werden
����2�+���5�����������2�+���5�����������2�+���5�����������2�+���5������� Host mit IP-Adresse nicht bekannt
����2������5�����������2������5�����������2������5�����������2������5������� Service bei URL nicht unterstützt
;�������5�������;�������5�������;�������5�������;�������5������� z.B. TCP Fehler
�������� �5������� �������� �5������� �������� �5������� �������� �5�������
����6�����5�����������6�����5�����������6�����5�����������6�����5������� Timeout für Socket-Operation
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 25�������������� ��������������
���������������������������
Literatur
� Horstmann, Cornell, Core Java 2, Band2 Expertenwissen, Markt und Technik, 2002: Kapitel 3
� Krüger, Handbuch der Java-Programmierung, 3. Auflage, Addison-Wesley, 2003, http://www.javabuch.de: Kapitel 45