Anda di halaman 1dari 4

Michael Peuss - Socket-Programmierung in Java

http://www.peuss.com/java/Sockets.php

Socket-Programmierung in Java
Warum Socket-Programmierung?
Sobald man Programme schreiben will, die nicht auf einem einzigen Rechner gespeichert sind, sondern auf mehrere beliebige Standorte, die miteinander vernetzt sind, verteilt sein knnen, muss man sich Gedanken darber machen, wie die einzelnen Programmteile miteinander kommunizieren knnen. Eine schon recht alte, aber immer noch hufig verwendete Methode ist die Kommunikation ber Sockets. Hierbei agiert das Programmteil, das einen Dienst anbietet als Server, das andere als Client. Java stellt mittlerweile einige recht komfortable Klassen zur Socket-Programmierung zur Verfgung. Das Package java.net enthlt die folgenden zwei Socket-Klassen: ServerSocket Socket (hiermit ist immer der Client-Socket gemeint) Neben den Socket-Klassen bentigt man fr die Kommunikation ber Streams folgende zwei Stream-Klassen aus dem Package java.io: OutputStream InputStream Mit diesen zwei Klassen lassen sich allerdings nur Interger-Zahlen bertragen. Falls man beliebige Objekte mit Streams bertragen mchte, braucht man aus java.io auch noch: ObjectOutputStream ObjectInputStream Das Einleiten vom Aufbau einer Socket-Verbindung ist immer die Aufgabe des Clients. Solange noch keine Verbindung besteht, hat der Server die Aufgabe, auf einem bestimmten Port zu hren, ob sich dort ein Client mit ihm verbinden will. Das folgend Aktivitts-Diagramm veranschaulicht die Situation.

1 von 4

16.05.2008 11:24

Michael Peuss - Socket-Programmierung in Java

http://www.peuss.com/java/Sockets.php

Einige wichtige Server-Methoden


Signatur / Aufruf Parameter Port, auf dem ServerSocket(int port) auf einen Client-Anfrage gewartet werden soll nachdem eine Client-Anfrage eingetroffen ist Socket accept() besteht beim Server die Mglichkeit, die Verbindung zu akzeptieren gibt eine bestimmte void setSoTimeout(int timeout) Wartezeit in Milli-Sekunden Zeit vor, nach der das Warten auf Client-Anfragen gestoppt wird das Warten auf close() Client-Anfragen wird IOException beendet java.net / ServerSocket SocketException java.net / ServerSocket IOException java.net / ServerSocket Erklrung es wird ein Server erzeugt, der auf dem bergebenen Port auf Clients wartet IOException java.net / ServerSocket Exceptions Package / Klasse

Einige wichtige Client-Methoden der Klasse Socket


Signatur / Aufruf Parameter Erklrung Exceptions Package / Klasse host: der Host auf dem sich der Server Socket(String host, int port) befindet port: Port, auf dem der Server auf eine Verbindung wartet host: IP vom Host auf dem Konstruktor: Erzeugt einen Stream-Socket und Konstruktor: Erzeugt einen Stream-Socket und verbindet diesen mit dem angegebenen Port auf dem angegebenen Host IOException java.net / Socket

sich der Server verbindet diesen mit dem Socket(InetAddress address, int port) befindet port: Port, auf dem der Server auf eine Verbindung wartet Damit beim Senden ber eine Socket-Verbindung alles gesendet void flush() wird und nichts zwischengepuffert wird, sollte man grundstzlich nach IOException java.io / java.io / OutputStream angegebenen Port auf der angegebenen Adresse. Dieser Konstruktor kann anstelle des vorherigen aufgerufen werden, wenn man anstelle des Hostnamens nur dessen IP hat. IOException java.net / Socket

2 von 4

16.05.2008 11:24

Michael Peuss - Socket-Programmierung in Java

http://www.peuss.com/java/Sockets.php
java.io / InputStream java.net / Socket java.net / Socket liefert die IP des eigenen Hosts liefert einen InputStream, den man UnknownHostException java.net / Socket

wird, sollte man grundstzlich nach dem Senden diese Methode aufrufen. zum Schliessen einer Socket-Verbindung String getHostName() InetAddress getLocalHost() liefert den Namen des Hosts

void close()

IOException

InputStream getInputStream()

braucht, um Daten ber eine Socket-Verbindung empfangen zu knnen liefert einen OutputStream, den man

IOException

java.net / Socket

OutputStream getOutputStream()

braucht, um Daten ber eine Socket-Verbindung verschicken zu knnen

IOException

java.net / Socket

Java-Code eines Servers


Der folgende Java-Code implementiert einen Server, der auf Port "1234" auf Anfragen von Clients wartet. Der Server hat die Aufgabe, 2 Zahlen die der Client ber die Socket-Verbindung schickt zu addieren und das Ergebnis zurck zu schicken. Es mssen grundstzlich beide im Bild angegebenen Pakete importiert werden. Die Main-Methode startet den Server. Dadurch wird als Attribut die neue Socket-Verbindung "server" angelegt und im Konstruktor in eine Endlosschleife gegangen, wo vorerst mal in Zeile 10 angehalten und auf Nachrichten vom Client gewartet wird.

Beschreibung des Codes:


solange auf Port 1234 nichts zu hren ist wartet der Server auf Anfragen (10) sobald ein Client eine Zahl schickt wird eine Verbindung aufgebaut (10 - 12)

3 von 4

16.05.2008 11:24

Michael Peuss - Socket-Programmierung in Java


sobald ein Client eine Zahl schickt wird eine Verbindung aufgebaut (10 - 12) zwei gesendete Zahlen werden eingelesen (13, 14)

http://www.peuss.com/java/Sockets.php

die Summe beider Zahlen wird als Antwort ber die Verbindung bermittelt (15) alle gepufferten Bytes abschicken (16) Eingabe und Ausgabestrom schliessen (17, 18) warten auf weitere Client-Anfragen (10)

Java-Code eines Clients


Jetzt wird ein mglicher Client implementiert, der den Dienst des Servers aus dem Beispiel oben nutzt. Der Client hat die Aufgabe eine Socket-Verbindung zum Server aufzubauen, diesem die Zahlen 5 und 10 zu bermitteln, die Antwort des Servers zu empfangen und diese auf der Konsole auszugeben. Danach soll die Verbindung geschlossen werden und der Client soll beendet werden (automatisch, weil alles abgearbeitet wurde). Die Main-Methode startet wieder nur den Client. Es muss natrlich bedacht werden, dass zuerst der Server gestartet sein muss, bevor ein Client eine Anfrage an ihn stellen kann. Nachdem der Client alles abgearbeitet hat und es diesen nicht mehr gibt, wartet der Server wieder auf neue Anfragen, weil dieser sich ja in einer Endlosschleife befindet

Beschreibung des Codes:


die Verbindung zum Server wird hergestellt (7 - 9) zwei Zahlen werden ber die Verbindung bermittelt (10, 11) der Ausgabepuffer wird geleert (12) das Ergebnis wird von der Eingabe gelesen und auf die Konsole geschrieben (13) die Verbindung zum Server wird beendet (14) Eingabe und Ausgabestrom schliessen (15, 16)

4 von 4

16.05.2008 11:24