Aufbau einer Verbindung zwischen Client und Server
Grundsätzlich verfügt die Java-Bibliothek über Klassen, über die eine Lowlevel-Netzwerk-Kommunikation mit anderen Computern möglich ist. Ermöglicht wird das durch einen bestimmten Verkettungsstrom, den BufferedReader und den BufferedWriter. Für das Lesen von Daten wird lediglich ein BufferedReader benötigt, für das Schreiben ein BufferedWriter.
Java unterstützt die Kommunikation über Stream Sockets in Verbindung mit dem TCP (Transmission Control Protocol) und über DatagramSockets, welche die Kommunikation mittels UDP (User Datagram Protocol) unterstützen.
Dies ermöglicht das Aufsetzten eines Chat-Programms zwischen mehreren Clients über einen Server. Dabei muss der Server alle Clients kennen, der Client wiederum nur den entsprechenden Server. Den Verbindungsaufbau möchte ich im folgenden kurz vorstellen:
- Client A verbindet sich mit einem Server.
- Der Server stellt eine Verbindung zu Client A her und fügt ihn zu einer Teilnehmerliste des Chats hinzu.
- Client B verbindet sich mit demselben Server.
- Jeder verbundene Client kann nun eine Nachricht an den Server schicken.
- Der Server verteilt die Nachricht an alle Clients.
Socket-Verbindungen
Der Client kann sich mit dem Server eine Socket-Verbindung aufbauen und so mit dem Server kommunizieren. Dazu muss die IP-Adresse und die TCP-Portnummer des Servers bekannt sein. Insgesamt gibt es 65.535 verfügbare TCP-Portnummern. Die Portnummern 0 bis 1.023 sind für „bekannte“ Dienste reserviert und sollten nicht belegt werden. Jedes Programm greift auf eine andere Portnummer zu. Daher weiß der Server durch die Angabe der Portnummer mit welchem Programm sich der Client verbinden möchte, sie dient also zur Identifikation.

Kommunikation zwischen Client und Server – Empfangen von Nachrichten des Servers
Nach der Etablierung einer Socket-Verbindung werden Eingang- und Ausgangsströme benutzt, um Daten lesen und schreiben zu können. Beim Empfangen von Nachrichten muss erste eine Socket-Verbindung zwischen Client und Server etabliert werden. Hierfür müssen IP-Adresse und TCP-Portnummer des Servers bekannt sein. Sobald die Verbindung steht, kann kommuniziert werden. Dazu wird ein BufferedReader benutzt. Ein InputStreamReader wird verwendet, um einen Low-Level-Bytestrom (Input durch Socket) und einen High-Level-Zeichenstrom, den BufferedReader zu verbinden.
Kommunikation zwischen Client und Server – Senden von Nachrichten an den Server
Genau wie bei dem Empfangen von Nachricht muss erst eine Socket-Verbindung unter Verwendung von IP-Adressen und TCP-Portnummern etabliert werden. Es wird ein PrintWriter benutzt, um den vom Socket des Clients kommenden Low-Level-Strom zu verketten. Mit der Methode writer.println wird die Nachricht an den Server übergeben.
ServerSockets – Anwendungen
Zuerst wird ein ServerSocket auf einem bestimmten Port erzeugt. Die Server-Anwendung wartet nun über die Verbindung auf eine Verbindungsanfrage eines Clients. Ein Client, der nun die IP-Adresse und die Portnummer des Servers kennt, kann sich mit dem Server verbinden. Der Server akzeptiert die Anfrage des Clients, in dem er einen neuen Socket für die Kommunikation mit dem Client erzeugt. Der Socket liegt auf einem anderen Port, damit der ServerSocket wieder frei ist, um auf Anfragen weiterer Clients zu warten. Da der Server immer nur einen neuen Client auf dem ServerSocket entgegennehmen kann, werden Threads benutzt und jeder neue Client-Socket einem anderen Thread übergeben.