Repozytorium projektu
Airport-Automatic-Landing-System
jakubBone • Updated Dec 20, 2024
Wprowadzenie JSON
Tym razem skupiłem się na poprawie komunikacji. Wdrożyłem format JSON
, używając biblioteki Gson
. W moim projekcie JSON
pełni rolę uniwersalnego języka komunikacji w relacji Client-Server
. Można to porównać do angielskiego w lotnictwie. Obie strony mogą wymieniać dane w spójny sposób, niezależnie od platformy czy języka programowania. JSON
pozwala na serializowanie i deserializowanie danych. Dzieki temu eliminujemy problemy niezgodności formatów czy złożonych struktur danych.
Izolacja komunikacji
Duży nacisk położyłem na poprawę czytelności kodu. Przeprowadziłem lekką refaktoryzację w klasach PlaneClient
oraz PlaneHandler
, gdzie wydzieliłem mniejsze metody, dzięki czemu kod stał się bardziej przejrzysty i łatwiejszy do zrozumienia. Uprościłem nazewnictwo zmiennych i metod. Wyizlowałem też logikę metod odpowiedzialnych za komunikację pomiędzy klientem a serwerem do nowej klasy Messenger
:
public class Messenger { private Gson gson; public Messenger() { this.gson = new Gson(); } public void send(Object message, ObjectOutputStream out) throws IOException { String jsonMessage = gson.toJson(message); out.reset(); out.writeObject(jsonMessage); out.flush(); } public String receive(ObjectInputStream in) throws IOException, ClassNotFoundException { return (String) in.readObject(); } public <T> T parse(String jsonMessage, Class<T> type) { return gson.fromJson(jsonMessage, type); } }
Przypadek braku paliwa
Przeprowadziłem refaktoryzację obsługi przypadków, w których samolotowi brakuje paliwa. Zamiast skomplikowanych procedur, teraz samolot przesyła do serwera prosty komunikat w formie Stringa
. To nie tylko uprościło kod, ale także zwiększyło jego czytelność. Dzięki temu serwer może teraz błyskawicznie reagować na krytyczne sytuacje, co znacząco poprawia całą obsługę awaryjnych scenariuszy. Prosty komunikat, wielkie korzyści:
while (!isProcessCompleted) { if (plane.isOutOfFuel()) { log.info("Plane [{}] is out of fuel. Collision", plane.getId()); messenger.send("OUT_OF_FUEL", out); break; } if(plane.getLocation() != null){ messenger.send(plane.getLocation(), out); } else { log.error("Plane [{}] disappeared from the radar", plane.getId()); break; } String message = messenger.receive(in); AirportInstruction instruction = messenger.parse(message, AirportInstruction.class); processInstruction(instruction); }
Usprawnienie obsługi lokalizacji
W ramach drobnych poprawek dodałem out.reset()
przed wysłaniem informacji do servera oraz out.flush()
po jej wysłaniu w klasie Messanger
. Dzięki tym zmianom poprawiłem aktualizację danych, co zapewnia ich natychmiastowe odświeżenie i lepszą synchronizację z serwerem:
public void send(Object message, ObjectOutputStream out) throws IOException { String jsonMessage = gson.toJson(message); out.reset(); // przed wysłaniem out.writeObject(jsonMessage); out.flush(); // po wysłaniu }