5. Experiment 5: [Chatui]
Datum: [06.06.2024] Thema: [Chatui]
5.1. Einleitung
Rust beinhaltet viele Bibliotheken welche unterschiedlichste Aufgaben erfüllen können. Eine dieser Bibliotheken ist Ratatui welche es erlaubt komplexe Text User Interfaces zu erstellen.
5.2. Motivation
Ziel des Projektes ist es sich mit den Funktionalitäten von Ratatui auseinander zu setzen. Hierfür wird als Beispielanwendung ein minimaler Chat-Client/Server implementiert der die Möglichkeiten darstellen soll.
5.3. Aufgabenstellung
Für einen vollständigen Chat müssen mehrere Aufgaben erfüllt werden:
Minimalimplementation eines Servers
Graphische darstellung von Chatverlauf, aktiven Nutzern und Eingabe im Terminal
Verwaltung mehrerer Threads für flüssigen Verlauf
Einfache Interaktion mit dem Programm
5.4. Anwendung
Das Programm kann wie jedes Rust Programm mit folgendem Command gebaut werden: .. code-block:: bash
cargo build
Beim ausführen des Programms können mehrere Argumente mitgegeben werden. Standardmäßig startet sich der Client als ein User mit dem Namen „anonymous“. Möchte man einen eigenen Nutzernamen angeben, so muss hier die Option -u mit dem gewünschten Namen gesetzt werden. Der Server wird gestartet in dem man die Flag -s beim Programmstart mitgibt. Sowohl Server als auch Client können mit der -i Option die IP mitgegeben. Ist diese bei beiden gleich gesetzt, so können beide miteinander kommunizieren.
5.5. Features
Durch die Ratatui Oberfläche ist es möglich sein Terminal auch während der Anwendung zu vergößern oder zu verkleinern, die Proportionen bleiben immer erhalten. Der Chat bereich beginnt ebenfalls das Scrollen, sollte der Platz im Fenster nicht mehr ausreichen.
Während des Verbindungsaufbaus wird ein Ladebildschirm gezeigt welcher bei erfolgreicher Verbindung zur eigendlichen Anwendung wechselt.
Verbindungsverlust wird erkannt und wechselt automatisch zurück in den Ladebildschirm.
Volle UTF-8 unterstützung im Chat
Beenden durch drücken der ESC-Taste zu jeder Zeit möglich
5.6. Funktionsweise
Die ersten Schritte des Programms übernimmt „clap“, welches sich um das auslesen der CLI-Argumente kümmert. Ist dies geschehen, so wird entweder der Server oder der Client gestartet.
Der Server schlicht und einfach dazu da eine empfangene Nachricht an alle verbundenen Clients weiter zu senden. Hierfür ist das Stream split Feature der Bibliothek „tokio“ praktisch. Mit diesem ist es möglich einen TCPStream in eine Lese- und eine Schreibe-hälfte zu trennen. Somit kann sich ein Thread um das Empfangen kümmern, während ein anderer das empfangene weitersendet.
Im Client passieren mehrerer Sachen. Nachdem das Terminal geleert wurde und in den Raw-Modus versetzt wurde, beginnt der Hauptteil des Programms. Es werden mehrere Threads gestartet, welche sich jeweils unterschiedliche Aufgaben haben. Zur Kommunikation zwischen diesen wird ein weiteres Feature der tokio Bibliothek verwendet, mpmc (Multiple Producer, Multiple Consumer). Mit diesem kann ein Thread eine Nachricht auf einen Stream legen, welche dann widerum von allen anderen gefetcht werden kann. Ein Beispiel für so eine Nachricht währe beispielsweise „Exit Signal erhalten“ oder „Nachricht empfangen“. Im folgendem werden die einzelnen Threads erklärt: 1. Render-Thread
Hier wird die Anzeige auf dem Terminal generiert. Mithilfe von Ratatui lassen sich sogannte Widgets auf verschiedene definierte Bereiche der Terminals rendern. Konkret wird hier der gesamte Terminalbereich in 3 Stücke geteilt und mit selbstdefierten Widget gefüllt. Ebenfalls wird auf Events reagiert um zum Beispiel zurück zum Ladebildschirm zu wechseln oder um eine neue Nachricht zu rendern.
Event-Thread
Dieser Thread kümmert sich um das Verwalten von Keyboard Events. Werden Tasten gedrückt, so wird hier die passende Nachricht auf den mpmc Kanal gelegt.
Connection-Thread
Hier werden alle wichtigen Aufgaben übernommen, die mit dem Server zu tun haben. Nach einem Verbindungsaufbau werden die nötigen Events gefeuert und der Kommunikationskanal in Lese- und Schreibe-hälfte getrennt. Somit kann sich ein Thread um das Empfangen und ein Anderer um das Lesen kümmern.
Das Zusammenspiel all dieser Threads ermöglicht nun einen vollständigen Chat-Client
5.7. Probleme
Die ursprünglich als schwierig angenommene Arbeit mit Ratatui stellte sich als ziemlich simpel heraus. Im Gegensatz dazu war die Arbeit mit der verwendeten Asynchronitätsbibliothek „tokio“ deutlich schwieriger. Es mussten viele neue Konzepte wie Futures erlernt und richtig angewendet werden. Auch das richtige Verwalten von einer multi-thread Anwendung bereitete anfangs Schwierigkeiten Dennoch hat sich diese Arbeit sehr gelohnt, da durch tokio der Code um einiges Simpler und weniger fehleranfällig geworden ist.