Java-Einsatz im Netzwerk

Chat-Client

Als passendes Gegenstück dient der folgende Client. Bei seinem Aufruf kann der Name des Servers als Argument übergeben werden. Fehlt diese Angabe, sucht der Client auf dem eigenen Rechner nach dem Server. Der Client meldet sich dann mit einem entsprechenden Paket beim Server an. In einer Schleife wartet er auf Eingaben. Jede Eingabe liest er als Zeichenkette (String) ein, wandelt sie in ein Feld von Bytes und verschickt sie dann als Paket. Besteht die Eingabe aus dem Text ENDE, so sendet er eine Abmeldenachricht an den Server. Anschließend meldet sich der Client ab.

Anders als bei dem Server erfolgt der Nachrichtenaustausch asynchron. Der Server wartet auf eine Nachricht und reagiert darauf. Demgegenüber kann beim Client zu jedem Zeitpunkt vom Server eine neue Nachricht eintreffen. Es gibt keine zeitliche Koppelung zwischen Eingaben und Ausgaben.

In der Programmiersprache Java und in der virtuellen Maschine zur Ausführung von Java-Anwendungen sind Möglichkeiten für parallele Verarbeitung integriert. Eine Anwendung kann in mehrere eigenständige Programmfragmente - so genannte Threads - aufgeteilt werden. Im vorliegenden Fall ist die Aufgabe in zwei solchen Threads implementiert. Die Hauptanwendung mit der Schleife für Benutzereingaben und dem Senden an den Server läuft in einem Thread. Die einkommenden Nachrichten behandelt ein eigener Verarbeitungsstrang in einem zweiten Thread. Beide Threads laufen dabei unabhängig voneinander parallel ab.

Programmtechnisch ist der zweite Thread in einer eigenen Klasse realisiert. Diese Klasse implementiert das Interface Runnable. Damit verpflichtet sie sich, eine Methode run zu realisieren. Bei der Instanzierung eines Objektes der Klasse ruft die Virtual Machine dann automatisch diese Methode auf und führt sie in einem eigenen Thread aus. Die Hauptanwendung braucht daher nur ein Objekt der Klasse anzulegen, um den zweiten Thread zu starten. Beim Anlegen übergibt sie im Konstruktor gleich den zur Kommunikation nötigen Socket.