[Tutorial] Ein Chat Server in Java – Teil 2 / 2

In diesem 2. Teil des Tutorials wollen wir uns um den Chat Client kümmern. Zum ersten Teil gehts hier.

In diesem Tutorial läuft der Client nur in der Console, allerdings ist es ein leichtes, den Client um ein GUI zu erweitern, da er dafür ausgelegt wurde.

Hier der volle Source Code: https://github.com/JuKu/chat-server-tutorial

Chat Client Version 1.0.0

Chat Client Version 1.0.0

 

#2 Der Chat Client

Die Klasse ChatMessage schauen wir uns diesmal nicht mehr genauer an, da wir diese bereits im 1. Teil behandelt haben. Die Klasse unterscheidet sich auch nur geringfügig vom Server, wenn ihr es genauer wissen wollt, müsst ihr einfach in den Source Code schauen.

Als nächstes erstellen wir eine Klasse ChatClient (auf Client Seite – nicht zu verwechseln mit der Klasse auf Serverseite!):

Die Klasse NetClient ist das Gegenstück zum NetServer und wie der Name schon vermuten lässt ein TCP Netzwerk Client.

Im Konstruktor legen wir einen Connection Timeout von 5 Sekunden fest und sagen dem Client, dass er sich bis zu 5 mal zum Server verbinden soll, falls ein Verbindungsversuch nicht gleich klappt (z.B. weil der Chat Server gerade down ist). Zwischen den Verbindungsversuchen wird jeweils 500ms gewartet.

In der Methode connect() verbinden wir dann zum Server:

Das ganze passiert asynchron, d.h. wenn der Verbindungsaufbau erfolgreich war oder gefailed ist, wird die Handler Methode (das Java 8 Lambda) aufgerufen. Während der Verbindungsversuchs wird im Code bereits weitergegangen (1), da der Client in einem eigenem Thread läuft. Sobald der Socket erstellt wurde und die Verbindung somit besteht, wird die Methode initSocket() aufgerufen:

Hier registrieren wir zuerst einen Close Listener, der aufgerufen wird, wenn der Server die Verbindung schließt. Außerdem wird hier der Message Handler registriert, der aufgerufen wird, wenn eine Nachricht empfangen wurde.

 

Hier noch die Main Klasse:

Wir haben die Anwendungslogik hier vom Netzwerk Code getrennt. Ganz oben wir der ChatClient erstellt. Den BufferedReader brauchen wir lediglich, um von der Tastatur lesen zu können. Danach registrieren wir den Message Receiver, der alle empfangen Nachrichten erhält. Dort wird geprüft, ob es sich um einen Login Request handelt und in diesem Fall der Username angefordert.

Eine Besonderheit stellt dabei dieser Code dar:

Vertx.IO nutzt Event Loops (Threads), um die Netzwerk Operationen effizient händeln zu können. Wenn wir jetzt aber von der Tastatur lesen, kann sich der Benutzer Zeit lassen, bis er seinen Username eingibt. Theoretisch würde jetzt der ganze Netzwerk Thread blockiert, kann also weder Nachrichten empfangen noch versenden. Damit dies nicht passiert, werden diese “Blocking Operationen” gesondert abgearbeitet und die executeBlocking() Methode genutzt.

Falls der Login erfolgreich war, kommt ebenfalls eine entsprechende Nachricht an, die in diesem Code abgearbeitet wird. Außerdem wird dann erst die Methode startConsole() aufgerufen, da der Benutzer erst nach dem Login Nachrichten schreiben können soll. Danach kann der Benutzer selbst Nachrichten eingeben und mit ENTER abschicken.

 

Falls ihr Lust habt, das ganze noch etwas zu erweitern, hier mal ein paar Feature Vorschläge:

  • Login mit Username & Passwort z.B. über MySQL Datenbank
  • eine Registrierung
  • Unterstützung einer SSL Verschlüsselung (sehr einfach mit Vertx.io umzusetzen: http://vertx.io/docs/vertx-core/java/#ssl)
  • GUI implementieren
  • Jeder Nutzer könnte anhand der clientID, die immer mitgeschickt wird, eine eigene Farbe erhalten (mit GUI)
  • Eine “User joined chat” Nachricht, wenn ein neuer User sich eingeloggt hat

 

Fragen & Anmerkungen könnt ihr wie immer in die Kommentare schreiben und auch Feedback ist ausdrücklich erwünscht!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.