Die vierte Woche des Programmierprojekts war auch die Woche der Basler Fasnacht. Dies brachte den Vorteil mit sich, dass wir die ganze Woche keine Vorlesungen hatten und stattdessen nur am Projekt arbeiten konnten. Trotzt teilweise längerer Festivitäten bis spät in die Nacht, sind wir daher gut vorangekommen.
Diese Woche waren Sanja und Moritz leider zumindest physisch abwesend. Moritz gab sich ganz der Fasnacht hin und war grössten teils mit seiner Clique unterwegs. Währen dessen genoss Sanja eine Woche Ferien mit ihrer Familie. Dank modernen Technologien wie WhatsApp und Discord blieben wir jedoch trotzdem miteinander in Verbindung und hielten uns über Vorschritte und Probleme auf dem Laufenden.
Bereits in der Woche zuvor haben wir zusammen eine grobe Übersicht an benötigten Paketen erstellt und untereinander abgesprochen wer sich vorerst mit welchen beschäftigt. Danach haben wir damit begonnen einzelne Klassen-Skelette für die verschiedenen Pakete zu erstellen. Darunter auch die abstrakte Klasse „Packet“, auf der alle anderen Pakete basieren.
Anfangs dieser Woche haben wir uns getroffen und gemeinsam die Paket-Skelette für den Login gefühlt. Die „PacketLogin“-Klasse sollte dann als Hilfestellung für die Implementierung der weiteren Pakete dienen. Darauf haben wir die verschiedenen Pakete nach Themenbereich untereinander aufgeteilt und sie dann einzeln implementiert. Auch dabei funktionierte die Zusammenarbeit sehr gut und die wenigen Probleme die Auftraten konnten durch kurze rückfragen bei anderen Gruppenmitgliedern gut gelöst werden.
Grob gesagt benutzen wir Pakete, wie auch im Alltag, um Informationen von einem Ort zum anderen zu übertragen. In unserem Fall Informationen vom Server zum Client und umgekehrt. Jedoch ist bereits bei diesem Vergleich Vorsicht geboten, denn genau genommen verschicken wir nicht das ganze Packet. Es wird nämlich lediglich ein gewisser Teil des Inhaltes übertragen, dazu später mehr.
Ein Paket besitzt eine Typ-Variable also eine Variable die beschreibt um welche Art von Packet es sich handelt. Es gibt bspw. Den Typ „LOGIN“ oder „JOIN_LOBBY“.
Ein Paket besitzt unterumständen eine „ClientId“. Also eine Nummer die den Benutzer eindeutig identifizier von dem das Packet stammt.
Ein Paket besitzt eine String-Variable. Also ein Stück Text aus ganz normalen Buchstaben. Diese enthalten die eigentliche Information die übertragen werden soll. Dieser Teil des Paketes ist auch der einzige der Tatsächlich verschickt wird. (ClientId natürlich auch, aber nicht aktiv). Im String können Informationen für mehrere Variablen enthalten sein. Denn er kann nach dem Empfang gesplittet also in verschieden Teile zerlegt werden.
Ein Paket besitz eine Methode „validate“, diese ist dafür zuständig denn Inhalt des zuvor genahnten Strings zu prüfen. Bspw. wird geprüft: Hat der String überhaupt einen Inhalt oder ist er zu lang für die benötigte Information usw.
Ein Paket besitzt eine Methode „processData“, darin werden die aus dem String gewonnen Informationen verarbeitet und dazu gehörige Methoden aufgerufen. Im Falle eines „JOIN_LOBBY“- Pakets wird hier der Spieler von dem das Paket stammt der von ihm angegebenen Lobby hinzugefügt, wenn nichts dagegen spricht.
Die meisten Pakete besitzen zudem zwei Konstruktoren. Einen für den Absender und einen für den Empfänger.
Möchte ein Client eine Information zum Server schicken. Erstellt er dafür ein passendes Packet mit der Information als String. Beim Erstellen des Paketes, wird zudem die „validate“-Methode aufgerufen um den Inhalt zu prüfen. Dann wird am Anfang des Strings die Paket-Typvariable hinzugefügt und der String wird über den Socket an den Server geschickt. (Ein socket ist in Java das Verbindungsstück um Computer über Netzwerke kommunizieren zu lassen).
Der Server „liest“ nun denn empfangenen String und trenn die Typvariable vom Rest. Kenn er denn Typ erstellt er ein dazu Passendes Paket. Auch hier wird die „validate“-Methode aufgerufen um den Inhalt zu prüfen. Dann wird „processData“-Ausgeführt und die Informationen entsprechend verarbeitet.
Um den Ablauf etwas klarer zumachen hier eine Flowchart die Matthias erstellt hat.
(mit „Daten aufbereiten“ ist das Splitten des empfangenen Strings für mehrere Variable gemeint)
(Wir sprechen hier bewusst von Befehlen da alle Clienteingaben momentan über die Konsole erfolgen)