Aplikacja Lotnisko || Part 5 || JSON w komunikacji
🚀

Aplikacja Lotnisko || Part 5 || JSON w komunikacji

notion image

Repozytorium projektu

Airport-Automatic-Landing-System
jakubBoneUpdated 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 }
 
notion image